通过ThreadLoad实现线程范围内的共享变量
来源:互联网 发布:mysql主从同步原理 编辑:程序博客网 时间:2024/06/03 13:50
线程共享变量可能出现的问题
使用ThreadLocal来避免共享变量的并发问题
实例代码
package cn.iktz.thread.demo;import java.util.Random;public class ThreadLocalTest2 {public static void main(String[] args) {for (int i = 0; i < 2; i++) {new Thread(new ThreadLocalTestSetData()).start();}}}class Object1 {public void get(ThreadLocal<Integer> x) {System.out.println("A from " + Thread.currentThread().getName() + " get data :" + x.get());}}class ThreadLocalTestSetData implements Runnable {private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();@Overridepublic void run() {int data = new Random().nextInt();System.out.println(Thread.currentThread().getName() + " has put data :" + data);threadLocal.set(data);// threadLocl用来存储数据,存储的数据与当前线程有关的而非全局的MyThreadScopeData.getThreadInstance().setName("name" + data);MyThreadScopeData.getThreadInstance().setAge(data);new Object1().get(threadLocal);}}
对ThreadLocal进行封装
package cn.iktz.thread.demo;import java.util.Random;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ThreadLocalTest3 {public static void main(String[] args) {for (int i = 0; i < 2; i++) {new Thread(new Runnable() {@Overridepublic void run() {int data = new Random().nextInt();System.out.println(Thread.currentThread().getName() + " has put data :" + data);MyThreadScopeData.getThreadInstance().setName("name" + data);MyThreadScopeData.getThreadInstance().setAge(data);new A().get();}}).start();}}static class A {public void get() {MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();System.out.println("A from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + ","+ myData.getAge());}}static class MyThreadScopeData {private MyThreadScopeData() {}static Lock lock = new ReentrantLock();public static MyThreadScopeData getThreadInstance() {lock.lock();try {MyThreadScopeData instance = map.get();if (instance == null) {instance = new MyThreadScopeData();/** 这里可能会出现并发问题,所以要加锁。 这里如果a线程创建了对象,并赋值,此时instance指向0X6666, 然后b来了get为null,也会创建一个对象并赋值,此时instance指向0x7777,0x6666被覆盖 b线程放入了0x7777的对象,此时切换到a线程,a也会放入0x7777的对象,则出现并发问题 */map.set(instance);}return instance;} finally{lock.unlock();}}private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}}
0 0
- 通过ThreadLoad实现线程范围内的共享变量
- ThreadLocal实现线程范围内的共享变量
- 线程范围内的共享变量
- 线程范围内的共享变量
- java基础--线程03--实现线程范围内的共享变量
- Thread学习(八) ThreadLocal实现线程范围内的共享变量
- 5、ThreadLocals实现线程范围内的共享变量
- ThreadLocal实现线程范围内共享变量
- 线程范围内共享变量
- ThreadLocal 线程范围内的共享变量
- ThreadLocal线程范围内的共享变量
- ThreadLocal线程范围内的共享变量
- 5-线程范围内共享变量
- ThreadLocal实现线程范围内的数据共享
- ThreadLocal实现线程范围内共享变量和对象
- 张孝祥ThreadLocal实现线程范围内共享变量(学习笔记)
- 五:java中线程范围内共享变量--Map实现
- 线程范围内共享变量的概念与作用
- 电子或通信领域当前的主流技术及其社会需求调查报告
- Android项目——Spinner的使用
- 数据结构例程——简单的计数排序
- 第七周实践项目5—排队看病模拟
- NEUOJ 1660 (容斥+矩阵)
- 通过ThreadLoad实现线程范围内的共享变量
- Autolayout与CATransform3D共同使用引发的问题解决
- Android 各国语言缩写及简称详细介绍
- JS温习:基础(一)变量,常量,数据类型
- OC学生成绩管理类(三 Student学生类)
- JS温习:基础(二)运算符
- 当优秀成为了一种习惯,坚持又算得了什么——英语总结
- 堆排列
- MapReduce 矩阵乘法