网络营销推广策略,seo培训资料,安卓开发公司,个人网站设计方案小编典典这里的所有答案都是正确的#xff0c;但是有些令人失望#xff0c;因为它们多少掩盖了聪明ThreadLocal的实现是多么的明智。我只是在寻找源代码#xff0c;ThreadLocal并且对它的实现方式印象深刻。天真的实现如果我要求您ThreadLocal在javadoc中描述的给定API的基础…小编典典这里的所有答案都是正确的但是有些令人失望因为它们多少掩盖了聪明ThreadLocal的实现是多么的明智。我只是在寻找源代码ThreadLocal并且对它的实现方式印象深刻。天真的实现如果我要求您ThreadLocal在javadoc中描述的给定API的基础上实现一个类该怎么办最初的实现可能是ConcurrentHashMap使用Thread.currentThread()作为其密钥。这样会很好地工作但确实有一些缺点。线程争用- ConcurrentHashMap是一个非常聪明的类但是它最终仍必须处理防止多个线程以任何方式破坏它并且如果不同的线程有规律地命中它将会降低速度。即使在线程完成并且可以进行GC处理后它仍永久保持指向线程和对象的指针。GC友好的实现好的再试一次让我们使用弱引用来处理垃圾回收问题。处理WeakReferences可能会造成混淆但是使用像这样构建的地图应该足够了Collections.synchronizedMap(new WeakHashMap())或者如果我们使用的是番石榴(应该是)new MapMaker().weakKeys().makeMap()这意味着一旦没有其他人抓住线程(暗示线程已完成)就可以对键/值进行垃圾收集这是一种改进但仍无法解决线程争用问题这意味着到目前为止我们ThreadLocal还不是全部令人赞叹的一堂课。此外如果有人决定在Thread完成后保留对象那么就永远不会对它们进行GC处理因此即使我们的对象现在在技术上无法到达也不会对其进行GC处理。聪明的实现我们一直在考虑ThreadLocal将线程映射为值但是也许这实际上并不是正确的思考方式。与其将其视为从Threads到每个ThreadLocal对象中的值的映射不如将其视为ThreadLocal对象到每个Thread中的值的映射怎么办如果每个线程都存储了该映射而ThreadLocal仅提供了该映射的一个不错的接口我们可以避免以前实现中的所有问题。一个实现看起来像这样// called for each thread, and updated by the ThreadLocal instancenew WeakHashMap()此处无需担心并发性因为只有一个线程将访问此映射。Java开发人员在这里比我们有一个主要优势-他们可以直接开发Thread类并向其添加字段和操作而这正是他们所做的。/* ThreadLocal values pertaining to this thread. This map is maintained* by the ThreadLocal class. */ThreadLocal.ThreadLocalMap threadLocals null;正如评论所暗示的确实是ThreadLocal对象为此跟踪的所有值的私有包映射Thread。的实现ThreadLocalMap不是WeakHashMap而是遵循相同的基本协定包括通过弱引用来持有其密钥。ThreadLocal.get() 然后实现如下public T get() {Thread t Thread.currentThread();ThreadLocalMap map getMap(t);if (map ! null) {ThreadLocalMap.Entry e map.getEntry(this);if (e ! null) {SuppressWarnings(unchecked)T result (T)e.value;return result;}}return setInitialValue();}而ThreadLocal.setInitialValue()像这样private T setInitialValue() {T value initialValue();Thread t Thread.currentThread();ThreadLocalMap map getMap(t);if (map ! null)map.set(this, value);elsecreateMap(t, value);return value;}本质上 在此线程中使用地图可以容纳我们所有的ThreadLocal对象。这样我们永远不必担心其他线程中的值(ThreadLocal字面上只能访问当前线程中的值)因此没有并发问题。此外一旦Thread完成其映射将自动进行GC处理并且将清除所有本地对象。即使将Thread其保留ThreadLocal对象也会被弱引用保留并且一旦ThreadLocal对象超出范围就可以将其清除。不用说这个实现给我留下了深刻的印象它很好地解决了很多并发问题(可以利用作为核心Java的一部分但这是可以原谅的因为它是一个非常聪明的类)并且允许快速和对仅一次需要一个线程访问的对象的线程安全访问。tl; dr ThreadLocal的实现非常酷并且比您乍看之下要快/聪明得多。如果您喜欢这个答案您可能也会喜欢我(不那么详细)的讨论ThreadLocalRandom。2020-09-15