設計執行緒安全的類 VS 發布執行緒安全的物件

2022-09-15 22:09:17 字數 1330 閱讀 5623

步驟:

找出構成物件狀態的所有變數

找出約束狀態變數的不變性條件

建立物件狀態的併發訪問策略

1.在現有的執行緒安全類中新增功能

(1)重用能減低工作量和提高正確性

(2)如果底層的類改變了同步策略,使用不同的鎖來保護它的狀態,則子類會被破壞

class bettervectorextends vector

return

absent;

}}

2.客戶端加鎖機制

(1)對於使用物件x的客戶端,如果知道x使用的是什麼鎖,則使用x本身用於保護其狀態的鎖,來保護這段客戶端**

(2)同樣會破壞同步策略的封裝

a.錯誤示例:

class listhelper

return

absent;

}}

b.正確示例:

class listhelper

return

absent;}}

}

3.組合:推薦方式

class improvedlistimplements list

public

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的建構函式後,無法對其修改。

public

final

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控制代碼代替.那麼到底什麼是執行緒安全呢?什麼時候需要考慮?如果程式涉及到多 執行...