Java并發(fā)編程實(shí)戰(zhàn) 第3章 對(duì)象的共享

1、可見性

1.1 失效數(shù)據(jù)

不同步,可能讀取到失效值。

@NotThreadSafe
public class MutableInteger {
   private int value;
   public int get() {return value;}
   public void set(int value) {this.value = value;}
}

1.2 不安全的64位操作

  • 多線程中使用共享且可變的long和double等類型的變量也是不安全的。

1.3 加鎖與可見性

  • happens-before
  • 確保所有線程都能看到共享變量的最新值,所有執(zhí)行讀操作或者寫操作的線程都必須在同一個(gè)鎖上同步。

1.4 volatile變量

  • volatile變量不會(huì)被緩存在寄存器或者其他處理器不可見的地方
  • volatile語義不足以確保遞增操作的原子性

2、發(fā)布與逸出

  • 發(fā)布一個(gè)對(duì)象是指使對(duì)象能夠在當(dāng)前作用域之外的代碼中使用。
  • 不要在構(gòu)造過程中使this引用逸出。

https://blog.csdn.net/zhangwei_david/article/details/84683407

3、線程封閉

  • 一種避免使用同步的方式就是不共享數(shù)據(jù)。

3.2 棧封閉

局部變量

https://blog.csdn.net/qq9808/article/details/80388660

3.3 ThreadLocal

  • ThreadLocal對(duì)象通常用于防止對(duì)可變的單實(shí)例變量或全局變量進(jìn)行共享。
  • ThreadLocal提供get set為每個(gè)使用該變量的線程都存有一份獨(dú)立副本。

https://blog.csdn.net/u010445301/article/details/111322569

4、不變性

  • 不可變對(duì)象一定是安全的
  • 不可變的對(duì)象和不可變的對(duì)象引用之間存在著差異

4.1 Final域

  • final域能確保初始化過程的安全性。
  • 除非需要更高的可見性,否則應(yīng)將所有的域都聲明為私有域。

5、安全發(fā)布

5.3 安全發(fā)布的常用模式

  • 靜態(tài)初始化函數(shù)中初始化一個(gè)對(duì)象引用
  • 對(duì)象引用保存到volatile類型域
  • 對(duì)象引用保存到某個(gè)正確構(gòu)造對(duì)象的final類型域
  • 講對(duì)象引用保存到一個(gè)由所保護(hù)的域

5.6 安全地共享對(duì)象

  • 線程封閉。
  • 只讀共享。
  • 線程安全共享。
  • 保護(hù)對(duì)象。只能通過持有特定鎖來訪問。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容