2017-07-17 68 views
0

我知道​​關鍵字使方法一次只能在單個類上運行。但這是問題。如何讓所有的類方法只在單線程上運行? (同步課?)

我有一個數據庫類的方法,例如insertAccount,updateSetting等。如果我使insertAccount,updateSetting同步,它們中的每個將一次只能在一個線程上運行。

如果有一種方法用於整個數據庫,它會很好,但沒有一個。如果一個線程調用insertAccount,另一個線程調用updateSetting在同一時間,它會變壞,對吧?

因爲只有其中一種方法可以隨時運行。那麼我該怎麼做?

有沒有辦法將類似​​的東西應用於全班?因此,如果第一個線程同時調用insertAccount和第二個線程調用updateSetting,則第二個線程必須等到第一個線程完成訪問數據庫。

+0

您應該使用鎖定機制,例如信號量 –

+1

您應該依賴(正確使用)具有適當事務隔離級別的數據庫事務,如果您擁有多個承載(Web)應用程序的節點,它甚至可以工作(假設他們使用相同的數據庫)。 –

+0

看看:https://stackoverflow.com/questions/442564/avoid-synchronizedthis-in-java?rq=1 –

回答

1

你誤解​​是如何工作的。

如果您通過​​標記了兩個類的方法,則只有其中一個方法可以在任何時刻執行(除非調用wait)。

另請注意,如果您有幾個此類的實例,您可以同時執行不同實例的方法。

+0

謝謝,嗯,所以你說它不會中斷?我只有1個數據庫類的實例。你確定我不需要任何鎖定機制? –

+1

是的。在所有訪問或修改對象狀態的方法上加入'synchronized'就足夠了。這不是最好的方法,但它是最簡單的方法。 – talex

+2

一般而言,只要將「同步」放在事物上而不考慮或不考慮,就不會使其神奇地線程安全或行爲「正確」。 –

5

The real回答這裏:退後一步,做一些學習。您不應該在這裏使用同步的,而是查看讀寫器需要獲取的對象之前轉向該「DB類」。有關更多信息,請參閱here

另一方面,您應該瞭解交易是什麼,以及您的數據庫如何支持這些。含義:存在不同類型的問題;和不同的層(應用程序代碼,數據庫)有不同的職責責任

你看,使用「試錯法」並不是一種可以在這裏實現的方法。你應該花一些時間研究潛在的概念嚴重。否則,你冒着損壞你的數據集的風險;更糟糕的是:你有冒險編寫大部分時間都能正常工作的代碼;但以「隨意」的模糊方式失敗。因爲這是多線程以不受控制的方式操作共享數據時發生的情況。

相關問題