不共享執行緒間的變數;
設定屬性變數為不可變變數;
每個共享的可變變數都使用乙個確定的鎖保護;
1. 通過架構設計
通過上層的架構設計和業務分析來避免併發場景。比如需要用多執行緒或分布式集群統計一堆使用者的相關統計值,由於使用者的統計值是共享資料,因此需要保證執行緒安全。從業務上分析出使用者之間的資料並不共享,因此可以設計乙個規則來保證乙個使用者的計算工作和資料訪問只被乙個執行緒或一台機器完成,這樣從設計上避免了接下來可能的併發問題。
2. 保證類無狀態
有狀態會限制橫向擴充套件能力,也可能產生併發問題。如果類是無狀態的,那它永遠是執行緒安全的。因此在設計階段盡可能用無狀態的類來滿足業務需求。
3. 區別原子操作和復合操作
常見的復合操作包括check-then-act, i++等。雖然check-then-act從表面上看很簡單,但卻普遍存在與我們日常的開發中,特別是在資料庫訪問這一塊。比如我們需要在資料庫裡存乙個客戶的統計值,當統計值不存在時初始化,當存在時就去更新。如果不把這組邏輯設計為原子性的就很有可能產生出兩條這個客戶的統計值。
在單機環境下處理這個問題還算容易,通過鎖或者同步來把這組復合操作變為原子操作,但在分布式環境下就不適用了。一般情況下是通過在資料庫端做文章,比如通過唯一性索引或者悲觀鎖來保障其資料一致性。當然任何方案都是有代價的,這就需要具體情況下來權衡。
4. 鎖
使用鎖應注意:
保證執行緒安全的思路
1 使用沒有資源共享的模型 2 有資源共享,但對共享資源只進行讀操作,不去改變資源 2.1不需要對共享資源進行寫操作 2.2使用不可變物件 3 直面執行緒安全 3.1保證原子性 3.2保證 的順序性 3.3保證 的可見性 原子性 比如a在乙個房間內做自己的事情,如果房間沒有上鎖,別的人進去房間會讓a...
如何保證執行緒安全?
執行緒安全 一般說來,確保執行緒安全的方法有這幾個 競爭與原子操作 同步與鎖 可重入 過度優化。競爭與原子操作 多個執行緒同時訪問和修改乙個資料,可能造成很嚴重的後果。出現嚴重後果的原因是很多操作被作業系統編譯為彙編 之後不止一條指令,因此在執行的時候可能執行了一半就被排程系統打斷了而去執行別的 了...
如何保證Java執行緒安全
不要跨執行緒訪問共享變數 使共享變數是final型別的 使共享變數唯讀 將共享變數的操作加上同步 對於volatile宣告的數值型別變數進行運算,往往是不安全的 volatile只能保證可見性,不能保證原子性 使用普通同步容器 vector,hashtable 的迭代器,需要外部鎖來保證其原子性。原...