优缺点和使用注意事项:
/* * ThreadLocal 用于每一个线程都有一个次线程对应的副本。“以空间换时间” 占用内存,提高效率,节约处理时间,同时保证事物一致性 * ThreadLocal防止内存泄漏的做法-->弱引用:WeakReference extends WeakReference<ThreadLocal> * 弱引用:引用对象如果不工作,JVM扫面到此现象后会回收引用数值,节省内存 * 强引用:eg String name = "zhangsan"; 一般对象如果不extends WeakReference都是强引用对象,特点是引用不消失,即使引用不工作了 * 引用值仍旧存在内存,不会被JVM回收掉 * * 写代码建议: 使用ThreadLocal后,可以手动调用其remove()方法。 * */
业务要求:
多线程下,实现线程内,多业务下数据共享使用; 实现线程之间数据彼此隔离
应用案例: 银行多人汇款
图:
应用代码模拟---> 获取线程数据conn
public class ConnectionManager { private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); private ConnectionManager(){} public static Connection getInstance(){ try { Connection conn = threadLocal.get(); if(conn == null){ conn = DriverManager.getConnection("");//获取数据库连接对象 threadLocal.set(conn); } return conn; } catch (SQLException e) { e.printStackTrace(); } return null; } }
要点: 使用map将线程和线程内公共数据绑定起来
代码1 自定义实现:
package thread; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * 1 实现线程范围内的数据共享 * 2 实现线程之间的数据隔离 * 3 使用map对象,将每个线程产生的数据放在map中,业务方法中 仅仅获取当前线程下的共享数据 达到2的目的 * * @author zm * *测试结果: Thread-0 has put data 757103510 A from Thread-0 the data is: 757103510 B from Thread-0 the data is: 757103510 Thread-1 has put data -150123253 A from Thread-1 the data is: -150123253 B from Thread-1 the data is: -150123253 */ public class ScopeShareDataInThread { // public static int sharedata; public static Map map = new HashMap(); public static void main(String[] args) { final Businness businness = new Businness(); for(int i=0; i<2; i++) { new Thread(new Runnable(){ @Override public void run() { sharedata = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + " has put data " + sharedata); map.put(Thread.currentThread(), sharedata); businness.business1(sharedata,map); businness.business2(sharedata,map); } }).start(); } } } class Businness { // 业务1 public void business1(int data,Map map){ System.out.println("A from " + Thread.currentThread().getName() + " the data is: " + map.get(Thread.currentThread())); } // 业务2 public void business2(int data,Map map){ System.out.println("B from " + Thread.currentThread().getName() + " the data is: " + map.get(Thread.currentThread())); } }
代码2 使用JDK提供的ThreadLocal类:
package thread; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * 使用jdk提供的类来实现 线程内数据共享 线程间数据隔离 * * threadLocal.set(sharedata) 会把数据放在当前线程中 * threadLocal.get() 回从当前线程中得到存放的数据 * * 其实 threadLocal = map.put(Thread.currentThread(), youdata); * * 测试结果: Thread-1 has put data 193003072 A from Thread-1 the data is: 193003072 B from Thread-1 the data is: 193003072 Thread-0 has put data -2012177886 A from Thread-0 the data is: -2012177886 B from Thread-0 the data is: -2012177886 * @author zm * */ public class MyThreadLocal { // public static ThreadLocal threadLocal = new ThreadLocal(); public static int sharedata; public static void main(String[] args) { final Businness1 businness = new Businness1(); for(int i=0; i<2; i++) { new Thread(new Runnable(){ @Override public void run() { sharedata = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + " has put data " + sharedata); threadLocal.set(sharedata); businness.business1(threadLocal); businness.business2(threadLocal); } }).start(); } } } class Businness1 { // 业务1 public void business1(ThreadLocal threadLocal){ System.out.println("A from " + Thread.currentThread().getName() + " the data is: " + threadLocal.get()); } // 业务2 public void business2(ThreadLocal threadLocal){ System.out.println("B from " + Thread.currentThread().getName() + " the data is: " + threadLocal.get()); } }
脑图:
相关推荐
包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)
jdk1.5.exe jdk1.5 jdk1.5下载
JDK1.5,JDK1.5
前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....
JDK1.5的泛型实现
绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...
JDK1.5的泛型实现.pdf
测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin
通过接口java.util.concurrent.Callable 的使用 实现线程的启用,程序为一个main的例子,可以直接运行(jdk1.5 以上版本)
jdk1.5.0.22 是jdk1.5的最后一版,jdk1.5 windows 64位官方正式版,绝对有效,jdk1.5 windows 64位官方正式版,绝对有效
jdk 1.5 中文 api chm jdk 1.5 中文 api chm
jdk1.5.0.22 是jdk1.5的最后一版
很实用的JAVA API中文参考文档,如果你开始讨厌HTML版本的API中文文档,试试这个吧,强大的索引功能使你开发更加愉快,分两卷,要都下了才能解压。
JDK1.5 API完整版JDK1.5 API完整版JDK1.5 API完整版
JDK1.5+1.6整合版(文件为txt文件,里面有百度网盘下载地址<文件太大所以用网盘>) 文件里含有1.5和1.6两个版本的JDK,并且附有一环境变量创建办法以及切换版本方法
“JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-else 循环,自动装包/拆包,枚举,可变参数, 静态导入
详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明
Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm
jdk1.5压缩包 解压缩可用 用于Windows系统
Java-jdk1.5安装包