java多线程学习(三)---线程范围内数据共享
2017-11-30 22:07
423 查看
初次尝试
发现取得的数据不正确
修改代码,再次尝试
数据获取正确
也可以使用ThreadLocal来实现
效果相同
public class ThreadScopeShareData { private static int data = 0; public static void main(String[] args) { for (int i = 0; i <2 ; i++) { new Thread(new Runnable() { @Override public void run() { data = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + "has put data :" + data); new A().get(); new B().get(); } }).start(); } } static class A{ public void get(){ System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data); } } static class B{ public void get(){ System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data); } } }
发现取得的数据不正确
修改代码,再次尝试
public class ThreadScopeShareData { private static int data = 0; private static Map<Thread,Integer> threadDate = new HashMap<Thread,Integer>(); public static void main(String[] args) { for (int i = 0; i <2 ; i++) { new Thread(new Runnable() { @Override public void run() { data = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + "has put data :" + data); threadDate.put(Thread.currentThread(),data); new A().get(); new B().get(); } }).start(); } } static class A{ public void get(){ int data =threadDate.get(Thread.currentThread()); System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data); } } static class B{ public void get(){ int data =threadDate.get(Thread.currentThread()); System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data); } } }
数据获取正确
也可以使用ThreadLocal来实现
public class ThreadLocalTest { private static ThreadLocal<Integer> x = new ThreadLocal<Integer>(); public static void main(String[] args) { for (int i = 0; i <2 ; i++) { new Thread(new Runnable() { @Override public void run() { int data = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + "has put data :" + data); x.set(data); new A().get(); new B().get(); } }).start(); } } static class A{ public void get(){ int data =x.get(); System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data); } } static class B{ public void get(){ int data =x.get(); System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data); } } }
效果相同
相关文章推荐
- ThreadLocal实现:java线程范围内的共享数据,线程外独立
- 多线程学习(四)-线程范围内共享数据
- Java线程范围内的共享数据(2)
- java线程范围内的数据共享
- 【java并发】线程范围内共享数据
- Java基础:多线程之线程范围内的数据共享ThreadLocal
- Java死锁和线程范围内共享数据
- java多线程与线程并发四:线程范围内的共享数据
- 黑马程序员---java中如何实现线程范围内共享数据
- Java并发05---线程范围内的共享数据
- Java基础——线程范围内的共享数据概念和作用
- Java基础——ThreadLocal实现线程范围内的数据共享
- java-线程-用ThreadLocal类实现线程范围内的数据共享
- Java高并发编程:线程范围内共享数据
- Java基础加强 线程范围内数据共享设计模式
- java 多线程 day05 线程范围内的数据共享
- java高级之线程范围内的共享数据
- Java并发库(五、六、七):线程范围内共享数据、ThreadLocal、共享数据的三种方法
- java多线程:5、线程范围内的数据共享_ThreadLocal
- Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类