生活随笔
收集整理的這篇文章主要介紹了
ThreadLocal和线程同步机制的对比
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ThreadLocal和線程同步都是為了解決多線程中相同變量的訪問沖突問題,那么,二者的區(qū)別在哪里?和線程同步機(jī)制對比,ThreadLocal有什么優(yōu)勢?
同步機(jī)制中通過對象的鎖機(jī)制保證同一時間只有一個線程來訪問變量,這是該變量是多個線程共享的,使用同步機(jī)制要縝密的分析什么時候?qū)ψ兞窟M(jìn)行讀寫,什么時候需要鎖定某個對象,什么時候釋放掉鎖等復(fù)雜的問題,程序設(shè)計和編寫難度大ThreadLocal則為每一個線程提供了一個獨(dú)立的變量副本,從而隔離了多個線程對訪問數(shù)據(jù)的沖突。因為每一個線程都有自己的變量副本,從而也就沒有必要進(jìn)行同步了。ThreadLocal提供了線程安全的對象的封裝,在編寫多線程代碼時,可以把不安全的變量封裝進(jìn)ThreadLocal。
由于ThreadLocal可以持有任意類型的對象,低版本的jdk所提供的get()方法的返回值是object類型的。需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。但是jdk5.0以后就是用了泛型從而解決了該問題。總的來說,對于多線程資源共享的問題,同步機(jī)制采用了“以時間換空間的”方式——訪問串行化,對象共享化。而ThreadLocal則采用了“以空間換時間”的方式:訪問并行化,對象獨(dú)享化。前者僅提供一份變量,讓不同的線程隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。
下面提供一個簡單的ThreadLocal的實現(xiàn)版本:
<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類在實現(xiàn)思路上是很接近的。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的ThreadLocal和线程同步机制的对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。