java多线程与线程并发四:线程范围内的共享数据
2014-04-07 19:28
459 查看
当多个线程操作同一个共有数据时,一个线程对共有数据的改变会影响到另一个线程。比如下面这个例子:两个线程调用同一个对象的的方法,一个线程的执行结果会影响另一个线程。
执行结果
这段代码的基本思路是,为不同的线程创建单独的实例。比如上面这段代码,有两个线程调用的ThreadLocalBiz的add方法,那么一共创建的两个ThreadLocalBiz实例。每个线程操作自己的专属实例,自然就不会相互干扰了。
在这段代码中,getBiz和add方法都没有加synchronized,就是因为单个实例只对应单个线程,不存在并发问题,自然也就不用加互斥锁了。
现在来仔细说说ThreadLocal。
ThreadLocal相当于一个Map。以当前线程作为key。
下面的代码
就相当于
可见,ThreadLocal完全可以被Map代替。java只是代为封装了一下。
线程:Thread-0,num:1 线程:Thread-1,num:1 线程:Thread-0,num:2 线程:Thread-0,num:3 线程:Thread-1,num:2
执行结果
这段代码的基本思路是,为不同的线程创建单独的实例。比如上面这段代码,有两个线程调用的ThreadLocalBiz的add方法,那么一共创建的两个ThreadLocalBiz实例。每个线程操作自己的专属实例,自然就不会相互干扰了。
在这段代码中,getBiz和add方法都没有加synchronized,就是因为单个实例只对应单个线程,不存在并发问题,自然也就不用加互斥锁了。
现在来仔细说说ThreadLocal。
ThreadLocal相当于一个Map。以当前线程作为key。
下面的代码
ThreadLocal<ThreadLocalBiz> LocalBiz = new ThreadLocal<ThreadLocalBiz>(); LocalBiz.set(new ThreadLocalBiz()); LocalBiz.get();
就相当于
Map<Thread, ThreadLocalBiz> ThreadMap = new HashMap<Thread, ThreadLocalBiz>(); ThreadMap.put(Thread.currentThread(), new ThreadLocalBiz()); ThreadMap.get(Thread.currentThread());
可见,ThreadLocal完全可以被Map代替。java只是代为封装了一下。
相关文章推荐
- 【Java多线程与并发库】7.多个线程之间共享数据的方式探讨
- 【Java多线程与并发库】7.多个线程之间共享数据的方式探讨
- 【java并发】线程范围内共享数据
- Java并发05---线程范围内的共享数据
- Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类
- 【Java多线程与并发库】06 多个线程之间共享数据的方式探讨
- Java多线程与并发应用-(6)-多个线程之间共享对象和数据的方式
- Java并发库(五、六、七):线程范围内共享数据、ThreadLocal、共享数据的三种方法
- Java基础:多线程之线程范围内的数据共享ThreadLocal
- java多线程与线程并发五:多个线程访问共享对象和数据的方式
- java多线程并发库高级应用 之 多个线程之间共享数据的方式探讨
- 【Java多线程与并发库】05 线程范围内共享变量ThreadLocal
- 多线程并发库高级应用 之 线程范围内共享数据
- java并发-多线程之线程范围内共享变量(5)
- 多线程并发库高级应用 之 线程范围内共享数据
- 多线程并发库高级应用 之 线程范围内共享数据
- java多线程:5、线程范围内的数据共享_ThreadLocal
- Java高并发编程:线程范围内共享数据
- java并发-多线程之多个线程之间共享数据(6)
- java多线程学习(三)---线程范围内数据共享