1
我有一個包含動作偵聽器(作爲JSF託管bean的一部分)的類。動作偵聽器中的代碼正在創建另一個類的新對象。類A. 該對象被用於調用該類別的一個函數..反過來需要確保只有1個線程訪問資源
public void invokeActionListener(ActionEvent act)
{
MyClass myclass=new MyClass();
myclass.invokeRequest();
}
invokeRequest功能處理的一些數據調用另一個函數B的函數B調用另一個函數。C調用d之後且然後流程結束..我想確保invokeRequest應該只被調用一次,直到完成流程,直到D完成。
我把同步函數invokeRequest()但同步不起作用。即使1個線程仍在工作,不同的線程也能夠調用此函數。
Class MyClass
{
public synchronized void invokeRequest()
{
invokeRequestB();
}
public void invokeRequestB()
{
invoke RequestC();
}
public void invokeRequestC()
{
invoke RequestD();
}
public void RequestD()
{
//Complete processing and end the flow.
}
請指導.....
但是這個對象的範圍是什麼Lock ..?..我的意思是每次點擊頁面上的一個按鈕時,我正在創建MyClass的一個新對象,並用這個新對象調用invokeRequest函數。我明白,因爲每次有一個新對象被送入Synchronize塊,線程就不會獲得任何鎖定。但是,對於這個類使用靜態最終對象Lock有什麼用處......沒有線索...... !! – AngelsandDemons
該類的所有實例共享靜態var實例。這就是爲什麼靜態變量也被稱爲「類變量」的原因。 – Fildor
@AngelsandDemons在您的示例代碼中,調用使用對象本身進行鎖定,但由於每次點擊都會創建一個新對象,因此很多調用可以並行運行。使用一個靜態字段(或類)來同步一次只能運行一個'invokeRequest()'的結果,*在任何MyClass實例*中。 (這就是我理解你想要的,如果不是,我會刪除答案) – kiheru