ThreadLocal深入理解
来源:互联网 发布:r语言高性能编程 pdf 编辑:程序博客网 时间:2024/06/03 19:09
JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量。
在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
我们来看一个示例吧
import java.util.Random;/** * ThreadLocal的深入理解 * * @author chinoukin * */public class ThreadLocalTest {private static ThreadLocal<Integer> x = new ThreadLocal<>();public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {int data = new Random().nextInt();x.set(data);System.out.println(Thread.currentThread().getName() + "放入id:" + data);MyLocalData myLocalData = MyLocalData.getMyLocalDataInstance();myLocalData.setId(data);myLocalData.setName("张三丰");new TestA().get();new TestB().get();}}, "线程1").start();new Thread(new Runnable() {@Overridepublic void run() {int data = new Random().nextInt();x.set(data);System.out.println(Thread.currentThread().getName() + "放入id:" + data);MyLocalData myLocalData = MyLocalData.getMyLocalDataInstance();myLocalData.setId(data);myLocalData.setName("张无忌");new TestA().get();new TestB().get();}}, "线程2").start();}static class TestA {public void get() {int data = x.get();MyLocalData myLocalData = MyLocalData.getMyLocalDataInstance();System.out.println("A从" + Thread.currentThread().getName() + "中拿出id:" + data);System.out.println("A从" + Thread.currentThread().getName() + "中拿出name:" + myLocalData.getName());}}static class TestB {public void get() {int data = x.get();MyLocalData myLocalData = MyLocalData.getMyLocalDataInstance();System.out.println("B从" + Thread.currentThread().getName() + "中拿出id:" + data);System.out.println("B从" + Thread.currentThread().getName() + "中拿出name:" + myLocalData.getName());}}}/** * 线程数据类(ThreadLocal) 每一个线程最多只有一个实例,保证每个线程自己数据类实例不会被其他线程破坏 * * @author chinoukin * */class MyLocalData {private MyLocalData() {}private static ThreadLocal<MyLocalData> map = new ThreadLocal<>();public static MyLocalData getMyLocalDataInstance() {MyLocalData myLocalData = map.get();if (myLocalData == null) {myLocalData = new MyLocalData();map.set(myLocalData);}return myLocalData;}private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
运行结果:
线程1放入id:569578798线程2放入id:-185649376A从线程1中拿出id:569578798A从线程2中拿出id:-185649376A从线程1中拿出name:张三丰A从线程2中拿出name:张无忌B从线程2中拿出id:-185649376B从线程2中拿出name:张无忌B从线程1中拿出id:569578798B从线程1中拿出name:张三丰通过执行结果我们可以发现,每个线程自己的ThreadLocal变量都是独立的,线程间互补干扰。
阅读全文
0 0
- 深入理解ThreadLocal
- ThreadLocal深入理解
- ThreadLocal深入理解2
- ThreadLocal深入理解
- 深入理解ThreadLocal
- 深入理解ThreadLocal
- ThreadLocal深入理解
- 深入理解ThreadLocal
- 深入理解ThreadLocal
- 深入理解ThreadLocal
- 深入理解ThreadLocal
- ThreadLocal深入理解 修订版
- 深入理解ThreadLocal
- 深入理解ThreadLocal
- 【Java】深入理解ThreadLocal
- 深入理解ThreadLocal
- 深入理解ThreadLocal
- 深入理解ThreadLocal
- 希尔排序
- 运行java 异常,但是异常并没有 打印,说明 异常没有被捕获
- org.springframework.orm.hibernate3.HibernateSystemException
- 浅谈DevOps
- 11.VC维度,模型选择,特征选择
- ThreadLocal深入理解
- c++(拷贝构造函数)
- jsp 页面传值 到后台 中文乱码解决方法
- Java基础之GC垃圾回收的历史
- Spring:一些常用的Spring Bean扩展接口
- lock与Monitor的用法
- cookielib的使用
- 静态内部类和非静态内部类的区别
- HTTP 1.1与HTTP 1.0的比较