- public class Thread implements Runnable {
- ThreadLocal.ThreadLocalMap threadLocals = null;
- }
- public class ThreadLocal<T> {
- public T get() {
- Thread t = Thread.currentThread();
- ThreadLocalMap map = getMap(t);
- if (map != null) {
- ThreadLocalMap.Entry e = map.getEntry(this);
- if (e != null)
- return (T)e.value;
- }
- return setInitialValue();
- }
- ThreadLocalMap getMap(Thread t) {
- return t.threadLocals;
- }
- public void set(T value) {
- Thread t = Thread.currentThread();
- ThreadLocalMap map = getMap(t);
- if (map != null)
- map.set(this, value);
- else
- createMap(t, value);
- }
- }
ThreadLocal的设计很简单,就是给线程对象设置了一个内部的Map,可以放置一些数据。JVM大年夜底层包管了Thread对象之间不会看到对方的数据。
应用ThreadLocal前提是给每个ThreadLocal保存一个零丁的对象,这个对象不克不及是在多个ThreadLocal共享的,不然这个对象也是线程不安然的
ThreadLocal 内存泄漏
栈封闭
其实,ThreadLocalMap的设计中已经推敲到这种情况,也加上了一些防护办法:在ThreadLocal的get(),set(),remove()的时刻都邑清除线程ThreadLocalMap里所有key为null的value。
所以每次应用完ThreadLocal,都调用它的remove()办法,清除数据就可以避免这个问题
弗成变对象
一个对象如不雅在创建后不克不及被修改,那么就称为弗成变对象。在并发编程中,一种被广泛承认的原则就是:尽可能的应用弗成变对象来创建简单、靠得住的代码
在并发编程中,弗成变对象特别有效。因为创建后不克不及被修改,所以不会出现操作共享变量导致的内存一致性缺点
然则法度榜样员们平日并不热衷于应用弗成变对象,因为他们担心每次创建新对象的开销。实际上这种开销经常被过分高估,并且应用弗成变对象所带来的一些效力晋升也抵消了这种开销
我们先来看一个应用同步来解决线程安然的例子
- public class SynchronizedRGB {
推荐阅读
【沙龙】51CTO诚邀您9月23号和多位技巧大年夜咖一路聊智能CDN的优化之路,抓紧时光哦! 互联网成长异常敏捷,所以我们创造了Web平台。平日 我们会忽视连通性等问题,但用户们却不会熟视无睹>>>详细阅读
本文标题:Java并发编程之并发代码设计
地址:http://www.17bianji.com/lsqh/37528.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示