本系列博客是對讀《Java併發編程實戰》的一點總結,讀這本書感受實在是太枯燥無味了,因此打算讀完總結回顧下,對於想要快速瞭解本書內容的朋友,很是適合閱讀此係列博客。編程
這一小節主要闡述,如何才能設計一個線程安全的類,在設計線程安全類的過程當中,須要包含如下三個要素:數組
對象的狀態:對象的狀態由變量構成,就是類中的字段。
安全
不變性條件:不變性條件是,在程序執行過程或部分過程當中,可始終被假定成立的條件。好比,循環的不變性條件就是隻有爲真纔開始循環。
bash
在上一節中咱們說過線程封閉,線程封閉主要是用來將數據封裝到線程內部,只能它本身使用。那麼實例封閉是幹什麼的? 若是某個對象不是線程安全的,能夠經過多種技術使其在多線程程序中安全的使用。在此節中介紹了一個Java監視器模式,遵循Java監視器模式的對象會把對象的全部可變狀態都封裝起來,並由對象本身內置的鎖來保護。多線程
//僞代碼
public final class Counter{
private long value = 0;
public synchronized long getValue(){
return value;
}
public synchronized long increment(){
return ++value;
}
}
複製代碼
Java中許多類都使用了Java監視器模式,,例如Vector和Hashtable,Java監視器模式僅僅是一種編寫代碼的約定。併發
有時候,某個現有的線程安全類能支持咱們所須要的全部操做,但更多的時候,現有的類只能支持大部分操做,這個時候就須要在不破壞線程安全性的狀況下添加一個新的操做。post
//僞代碼
public class ImprovedList<T> implements List {
private final List<T> list;
public ImprovedList(List<T> list) {
this.list = list;
}
public synchronized boolean putIfAbsent(T x) {
boolean contains = list.contains(x);
if (!contains) {
list.add(x);
}
}
//按照此種方式委託list的其餘方法
public synchronized void clear() {
list.clear();
}
}
複製代碼
代碼中ImprovedList經過對List對象的操做委託給底層的List實例來實現List的操做,新增一個若是沒有則添加的方法。這就是組合。事實上使用了Java監視器模式來封裝現有的List,而且只要在類中擁有指向底層List的惟一外部引用,就能確保線程安全性。ui
你們看后辛苦點個贊點個關注哦!查看我的主頁,有更多的博客哦。若有錯誤,煩請指正。 有興趣加羣一塊兒交流。 this
![]()