Java 多线程同步问题的探究(五、你有我有全都有—— ThreadLocal如何解决并发安全性?)
2010-05-14 00:00:00 来源:WEB开发网这里,多个线程对象都使用同一个实现了Runnable接口的ThreadDemo3对象来构造。这样,多个线程使用的ThreadLocal对象就是同一个。结果仍然是正确的。但是仔细回想一下,这两种实现方案有什么不同呢?
答案其实很简单,并没有本质上的不同。对于第一种实现,不同的线程对象当中ThreadLocalMap里面的KEY使用的是不同的 ThreadLocal对象。而对于第二种实现,不同的线程对象当中ThreadLocalMap里面的KEY是同一个ThreadLocal对象。但是从本质上讲,不同的线程对象都是利用其自身的ThreadLocalMap对象来对各自的Student对象进行封装,用ThreadLocal对象作为该ThreadLocalMap的KEY。所以说,“ThreadLocal的思想精髓就是为每个线程创建独立的资源副本。”这句话并不应当被理解成:一定要使用同一个ThreadLocal对象来对多个线程进行处理。因为真正用来封装变量的不是ThreadLocal。就算是你的程序中所有线程都共用同一个ThreadLocal对象,而你真正封装到ThreadLocalMap中去的仍然是.hashCode()方法返回不同值的不同对象。就好比线程就是房东,ThreadLocalMap就是房东的房子。房东通过ThreadLocal这个中介去和房子里的房客打交道,而房东不管要让房客住进去还是搬出来,都首先要经过ThreadLocal这个中介。
所以提到ThreadLocal,我们不应当顾名思义的认为JDK里面提供ThreadLocal就是提供了一个用来封装本地线程存储的容器,它本身并没有Map那样的容器功能。真正发挥作用的是ThreadLocalMap。也就是说,事实上,采用ThreadLocal来提高并发行,首先要理解,这不是一种简单的对象封装,而是一套机制,而这套机制中的三个关键因素(Thread、ThreadLocal、ThreadLocalMap)之间的关系是值得我们引起注意的。
更多精彩
赞助商链接