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 棧封閉
局部變量
3.3 ThreadLocal
- ThreadLocal對(duì)象通常用于防止對(duì)可變的單實(shí)例變量或全局變量進(jìn)行共享。
- ThreadLocal提供get set為每個(gè)使用該變量的線程都存有一份獨(dú)立副本。
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ì)象。只能通過持有特定鎖來訪問。