日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ThreadLocal和线程同步机制的对比

發布時間:2023/12/10 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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和线程同步机制的对比的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。