2013-09-16 49 views
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. 
} 

請指導.....

回答

3

同步的方法,利用各自的對象鎖定。如果您需要阻止不同對象中的同步呼叫,則仍需要使用同一個對象進行同步。使用靜態字段同步到其中一個辦法:

Class MyClass { 
    private static final Object lock = new Object(); 

    public void invokeRequest() { 
     synchronized (lock) { 
      invokeRequestB(); 
     } 
    } 
    ... 
} 

或者你可以使用MyClass.class作爲監測對象;使用任何你發現更可讀的東西。

+0

但是這個對象的範圍是什麼Lock ..?..我的意思是每次點擊頁面上的一個按鈕時,我正在創建MyClass的一個新對象,並用這個新對象調用invokeRequest函數。我明白,因爲每次有一個新對象被送入Synchronize塊,線程就不會獲得任何鎖定。但是,對於這個類使用靜態最終對象Lock有什麼用處......沒有線索...... !! – AngelsandDemons

+0

該類的所有實例共享靜態var實例。這就是爲什麼靜態變量也被稱爲「類變量」的原因。 – Fildor

+0

@AngelsandDemons在您的示例代碼中,調用使用對象本身進行鎖定,但由於每次點擊都會創建一個新對象,因此很多調用可以並行運行。使用一個靜態字段(或類)來同步一次只能運行一個'invokeRequest()'的結果,*在任何MyClass實例*中。 (這就是我理解你想要的,如果不是,我會刪除答案) – kiheru

相關問題