步驟:
找出構成物件狀態的所有變數
找出約束狀態變數的不變性條件
建立物件狀態的併發訪問策略
1.在現有的執行緒安全類中新增功能
(1)重用能減低工作量和提高正確性
(2)如果底層的類改變了同步策略,使用不同的鎖來保護它的狀態,則子類會被破壞
class bettervectorextends vectorreturn
absent;
}}
2.客戶端加鎖機制
(1)對於使用物件x的客戶端,如果知道x使用的是什麼鎖,則使用x本身用於保護其狀態的鎖,來保護這段客戶端**
(2)同樣會破壞同步策略的封裝
a.錯誤示例:
class listhelperreturn
absent;
}}
b.正確示例:
class listhelperreturn
absent;}}
}
3.組合:推薦方式
class improvedlistimplements listpublic
synchronized
boolean
putifabsent(e e)
return
absent;
}public
synchronized
boolean
add(e e)
}
1. 發布物件:使物件能在當前作用域之外的**中使用。既將物件的引用傳遞到其他類的變數和方法。
(1)變數的靜態初始化
(2)宣告為volatile變數 或 atomicreferance物件
(3)宣告為final變數
2. 成員變數的初始化:
(1)直接初始化
(2)建構函式初始化
3. 不可變物件、可變物件
在j**a記憶體模型中,final域能確保初始化過程的安全性,從而可以不受限制的訪問不可變物件,並在共享這些物件時無需同步。
在可變物件基礎上構建的不可變類:雖然set物件是可變的,但set物件通過threestooges的建構函式後,無法對其修改。
publicfinal
class
threestooges
public
boolean
isstooge(string name)
}
執行緒安全(常用的執行緒安全類)
string中的stringbuffer list集合中的vector copyonwritearraylist reentrantlock lock鎖 是執行緒安全的arraylist vector是增刪改查方法都加了synchronized,保證同步,但是每個方法執行的時候都要去獲得鎖,效能就會...
設計執行緒安全的Servlet
設計執行緒安全的servlet 例項變數和類變數不正確的使用是造成servlet執行緒不安全的主要原因。1 實現 singlethreadmodel 介面 2 同步對共享資料的操作 使用synchronized 關鍵字能保證一次只有乙個執行緒可以訪問被保護的區段,在本 中的servlet可以通過同步...
設計安全的多執行緒應用程式 執行緒安全
以前常聽高手告誡mfc物件不要跨執行緒使用,因為mfc不是執行緒安全的。比如cwnd物件不要跨執行緒使用,可以用視窗控制代碼 hwnd 代替。csocket casyncsocket物件不要跨執行緒使用,用socket控制代碼代替.那麼到底什麼是執行緒安全呢?什麼時候需要考慮?如果程式涉及到多 執行...