生活随笔
收集整理的這篇文章主要介紹了
ThreadLocal和线程同步机制的对比
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ThreadLocal和線程同步都是為了解決多線程中相同變量的訪問沖突問題,那么,二者的區別在哪里?和線程同步機制對比,ThreadLocal有什么優勢?
同步機制中通過對象的鎖機制保證同一時間只有一個線程來訪問變量,這是該變量是多個線程共享的,使用同步機制要縝密的分析什么時候對變量進行讀寫,什么時候需要鎖定某個對象,什么時候釋放掉鎖等復雜的問題,程序設計和編寫難度大ThreadLocal則為每一個線程提供了一個獨立的變量副本,從而隔離了多個線程對訪問數據的沖突。因為每一個線程都有自己的變量副本,從而也就沒有必要進行同步了。ThreadLocal提供了線程安全的對象的封裝,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。
由于ThreadLocal可以持有任意類型的對象,低版本的jdk所提供的get()方法的返回值是object類型的。需要進行強制類型轉換。但是jdk5.0以后就是用了泛型從而解決了該問題。總的來說,對于多線程資源共享的問題,同步機制采用了“以時間換空間的”方式——訪問串行化,對象共享化。而ThreadLocal則采用了“以空間換時間”的方式:訪問并行化,對象獨享化。前者僅提供一份變量,讓不同的線程隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。
下面提供一個簡單的ThreadLocal的實現版本:
<span style="font-size:18px;">public class SimpleThreadLocal
{private Map valueMap= Collections.synchronizedMap(new HashMap)public void set (Object newValue){valueMap.put(Thread.currentThread(),newValue);}public Object get(){Thread currentThread = Thread.currentThread();Object o = valueMap.get(currentThread);if(null == o &&!valueMap.containsKey(currentThread)){o = initialValue();valueMap.put(currentThread,o);}return o;}public void remove(){valueMap.remove(currentThread);}public Object initialValue(){return null;}
}</span>
圖中代碼所示的思路和JDK所提供的ThreadLocal類在實現思路上是很接近的。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的ThreadLocal和线程同步机制的对比的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。