定義:當多個執行緒訪問某個類時,不管執行環境採用何種呼叫方式或者這些執行緒如何交替執行,並且在主調**中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。
主要表現三個方面:
atomic***:cas、unsafe.compareandswapint
atomiclong、longadder
atomicreference、atomicreferencefieldupdater
atomicstampreference:cas的aba問題
synchronized:依賴jvm
修飾**塊:大括號括起來的**,作用於呼叫的物件。
修飾方法:整個方法,作用於呼叫的物件。
修飾靜態方法:整個靜態方法,作用於所有物件。
修飾類:括號括起來的部分,作用於所有物件。
lock:依賴特殊的cpu指令,jdk**實現,reentrantlock
對比
執行緒交叉執行。
重排序結合執行緒交叉執行。
共享變數更新後的值沒有在工作記憶體與主存間即時更新。
2.1可見性-synchronized
jmm關於synchronized的兩條規定:
執行緒解鎖前,必須把共享變數的最新值重新整理到主記憶體。
執行緒加鎖時,將清空工作記憶體中共享變數的值,從而使用共享變數時需要從主記憶體中重新讀取最新的值(加鎖和解鎖是同一把鎖)
2.2可見性-volatile
通過加入記憶體屏障和禁止重排序優化
來實現
對volatile變數寫操作時,會在寫操作後加入一條store屏障指令,將本地記憶體中的共享變數值重新整理到主記憶體。
對volatile變數讀操作時,會在讀操作前加入一條load屏障指令,從主記憶體中讀取共享變數。
發布物件:使乙個物件能夠被當前範圍之外的**使用。
物件逸出:一種錯誤的發布。當乙個物件還沒有構造完成時,就使它被其他執行緒所見。
安全發布物件方法:
在靜態初始化函式中初始化乙個物件引用
將物件的引用儲存到volatile型別域或者atomicreference物件中
將物件的引用儲存到某個正確構造物件的final型別域中
將物件儲存到乙個由鎖保護的域中
單例模式
通過列舉類實現單例模式(類似於內部類,jvm保證列舉類只呼叫一次建構函式),最安全的方式。
public
class
singletonexample
//通過列舉類實現例項化
private
enum singleton
public singletonexample getinstance()
}public
static singletonexample getinstance()
}
餓漢式單例模式
public
class
singletonexample
//使用靜態塊或者靜態域初始化,注意靜態域或靜態**塊相對先後位置,初始化時會按先後順序執行的。
//private static singletonexample instance=new singletonexample();
private
static singletonexample instance=null;
static
public
static singletonexample getinstance()
}
懶漢式單例模式
public
class
singletonexample
//1. memory=allocate() 分配物件的記憶體空間
//2. ctorinstance() 初始化物件
//3. instance=memory 設定instance指向剛分配的記憶體
//jvm和cpu優化,發生指令重排,使得賦值在初始化物件前,返回未初始化的物件,呼叫會發生問題。
//1. memory=allocate() 分配物件的記憶體空間
//3. instance=memory 設定instance指向剛分配的記憶體
//2. ctorinstance() 初始化物件
//volatile處理指令重排帶來的執行緒不安全問題
private
static
volatile singletonexample instance=null;
public
static singletonexample getinstance()
}}return instance;
}}
執行緒安全性
執行緒安全性 當多個執行緒訪問某個類時,這個類始終都能表現出正確的行為,那麼稱這個類是執行緒安全的。執行緒不安全產生的問題 競態條件 由於不恰當的執行時序而出現不正確的結果。大多數競態條件的本質是基於一種可能失效的觀察結果來做出判斷或者執行某個計算。常見先檢查後執行,延遲初始化 單例模式 讀取 修改...
STL 執行緒安全性
stl 執行緒安全性 摘錄 在所有的主流stl實現方案中,幾乎所有的容器都是執行緒安全的 1 乙個執行緒讀寫乙個例項時,另乙個執行緒可以讀寫另乙個例項。2 多個執行緒可以在同時讀同乙個container。3 多個執行緒讀寫同乙個container時,你應該負責安排互斥性操作。乙個特例是std str...
2執行緒安全性
當多個執行緒訪問可變的同乙個狀態變數沒有正確的同步,那麼就會出現錯誤,有三種方式可以修復這種錯誤 將狀態變數修改為不可變的變數 在訪問狀態變數時使用同步 編寫併發應用程式的時候,一種準確地程式設計方式是 首先使 正確執行,然後在提高 的速度。即便如此,最好也只是當測試結果和應用需求告訴你必須提高效能...