2010-12-15 63 views
0

同步方法我有以下的Java實現,我想使用一個synchronized方法:問題在Java

class dbAccess{ 
    public synchronized void getGUID(){ 
      counter=/*Access last count from txn_counter table */ 
      /*Insert a unique value to txn_counter table based on the acquired value of counter */ 
      /*Insert new counter value to GUID_log table */ 
    } 
} 

/* * /代表的一些SQL查詢之間的部分。該實現有10個線程。我希望每次返回的計數器值都是唯一的。但恰巧多次運行返回相同的計數器值。

請你指出我是否做錯了什麼。而且,這是做到這一點的正確方法嗎?

回答

3

也許你有幾個例子dbAccess? (​​關鍵字在對象級別上不在類級別上工作。)在這種情況下,您需要使方法成爲靜態(可能在您的情況下不可行),或嘗試使用靜態鎖來保護方法正文,如下所示:

class dbAccess{ 
    private final static Object o = new Object(); 

    public void getGUID(){ 
     synchronized (o) { 
      counter=/*Access last count from txn_counter table */ 
      // Insert a unique value to txn_counter table based on 
      // the acquired value of counter 
      // Insert new counter value to GUID_log table 
     } 
    } 
} 
+0

感謝您指出了多個dbAccess實例的問題。這就是我正在做的。現在,我試圖按照您的建議將其作爲靜態方法來實現。我希望這對我有用。 – jitendra 2010-12-16 04:43:22

5

僅僅因爲它在java中同步,並不意味着它在數據庫上同步。此方法需要在啓用了讀取鎖定的數據庫事務中運行。

+2

在事務中運行最重要的部分是txn_counter中的已更改值需要在下一個線程讀取「來自txn_count的最後一個計數」之前提交給數據庫。 – 2010-12-15 22:00:16

+0

這是合理的建議,但是如果數據庫專用於應用程序,並且只有一個應用程序實例,並且他實際上在db代碼中提交了這些更改,則應用程序中的同步方式將起作用。顯然,基於必須滿足的那些先決條件,它會相當脆弱。 – 2010-12-16 02:04:48

+0

@Tim,我的db和應用程序符合你描述的情況。數據庫專用於應用程序,並且只有一個應用程序正在運行。而且,我一直在嘗試從應用程序同步數據庫訪問部分。我希望它能在讀寫數據庫時獲得鎖定。 – jitendra 2010-12-16 04:39:32