2013-02-26 158 views
1

我發現一個代碼片段工作正常,直到鎖定在對象級別,並且當同一個鎖定爲靜態最終(即添加了靜態關鍵字)時,代碼開始與併發相關的錯誤失敗。對象級別和類級別鎖定

一旦鎖定器的作用域變爲靜態,鎖定器應該在對象級別工作的鎖定器工作嗎?我認爲把鎖作爲靜態只會使它更具限制性,並且不應該引發比當它處於對象級時更多的併發性問題。然而,我發現了相反的情況。

+1

你可能會發布代碼? – radai 2013-02-26 20:58:17

+0

也更具體的錯誤 – 2013-02-26 20:59:27

+0

出現了什麼錯誤? – 2013-02-26 21:06:58

回答

1

一旦工作在對象級別的鎖定reamin一旦它的作用域變爲靜態就可以工作嗎?

如果你被一個實例鎖定移動鎖定爲靜態鎖,它不應該原因併發問題。你是正確的,它應該使代碼更具限制性,因爲將使用單個鎖代替多個實例鎖。這當然是,如果有問題的鎖是static final,並且代碼中的所有位置都正確鎖定它。

public static final Object lockObject = new Object(); 

什麼可能發生的情況是,移動鎖已經發現,這是以前有一個錯誤,但申請時間是導致它被隱藏。通過鎖定static鎖定(或在static方法上),應用程序中的線程時間很可能會發生顯着變化。

如果您發佈有關代碼或錯誤的更多詳細信息,我們可以提供更好的答案。

+0

thx格雷,這是我唯一的疑問。最近,即使在對象級別鎖定的情況下,我也開始獲得更多的隨機錯誤。稍後我會用更好的代碼基礎來改進我的問題,從那裏討論。 – fortm 2013-02-26 21:16:26

0

處於靜態級別的鎖將更有可能在不同的線程之間共享,而不是在對象級鎖(以一種非常普通的方式 - 因爲它取決於實際的代碼和涉及的線程)。

實際上,靜態鎖與類相關聯,換句話說,單鎖對象在所有線程之間共享。通常當更多的線程需要訪問相同的鎖時,如果代碼中存在錯誤,則更有可能遇到併發問題(如死鎖和飢餓)。

作爲概括,如果您遇到使用對象級別鎖定的併發問題,則將鎖升級到類級別時可能會遇到更多麻煩。

+0

對我來說更壞的消息..當我將這些鎖定爲靜態時,我也偶爾會遇到死鎖。所以得到了一些功課:P – fortm 2013-02-26 21:19:37

+0

如果你的問題與數據庫訪問有關,可以嘗試使用像休眠這樣的ORM庫。或者,您也可以嘗試將插入分隔爲單獨的SQL事務。 – RudolphEst 2013-02-26 21:25:12