2013-04-10 67 views
2

改寫爲清楚的對象使用了synchronized塊隱式鎖我爲什麼不能直接訪問(和鎖)

我想能夠使用synchronized塊有更明確的鎖定混合通過在適當時直接調用鎖定和釋放方法。因此,當我可以脫身使用sychtronized(myObject)時,允許我使用sysyxtically的syntaxtical糖,但也可以調用myObject.lock & myObject.unlock在當一個同步塊的靈活性不足以滿足我需要的時候完成。

我知道每一個對象都隱含着一個內置於其中的由同步塊使用的租賃鎖。實際上,每次進入同步塊時,對象內部的可重入鎖都會鎖定鎖方法,並且當您離開同步塊時會在同一個可重入鎖上調用解鎖。我似乎很容易讓一個人能夠手動鎖定/解鎖這個隱式的可重入鎖;從而允許混合同步塊並顯示鎖定。

但據我所知,沒有辦法做到這一點。由於同步塊的工作方式,我不相信有一種方便的方法將它們與明確的鎖定相混合。看起來好像這將是一個相當方便,並且可以通過擴展Object api來添加鎖定/解鎖方法來輕鬆添加。

我的問題是,爲什麼不存在?我確定有一個原因,但我不知道它是什麼。我認爲這個問題可能與封裝有關;同樣的原因,你不想做同步(這)。然而,如果我已經調用了sycnhronized(myObject),那麼通過定義,任何知道myObject的人都可以同步它,並在愚蠢的情況下導致死鎖。封裝問題取決於誰可以訪問您同步的對象,而不管您使用sychtronized塊還是手動鎖定對象;至少在我看到它的時候。那麼是否還有其他一些優勢不允許手動鎖定對象?

+0

只是要清楚(並防止像我現在刪除的和其後的那個答案),你說你想在同一臺顯示器上同步,但你**不要**想要使用'synchronize'語句。你希望(有效地)獲得某種監視器對象,並調用一個'lock'方法,執行其他邏輯並調用'release'。所以這不是關於同步方法與同步塊的問題,而是關於通過顯式「鎖定」和「釋放」「調用」來使用同一監視器的問題。 – 2013-04-10 13:32:28

+0

現在我不確定他想知道什麼,最後一段作爲一個高級面向對象設計主題是有意義的,第一段是初學者在線程安全方面的問題;在他的中間段,他講述了sycronized的塊,他可能意味着同步的方法,或者同步這個。所有有點混淆 – AlexWien 2013-04-10 13:51:38

+0

是TJ,我在問你在說什麼。對不起,如果我沒有說好,我想不出如何表達我想要的東西 – dsollen 2013-04-10 16:17:06

回答

4

某個對象的鎖定與實例本身高度相關。​​塊的結構和方法非常嚴格。如果作爲程序員,你有可能干擾系統(虛擬機),它可能會導致嚴重的問題。

  • 你最終可能釋放是由​​塊中創建一個鎖
  • 您創建一個鎖定另一個​​塊將釋放
  • 您創造更多的鎖定退出你創造出比出口更鎖條目比條目

甚至還有爲lockrelease操作定義的特定字節碼。如果您對此鎖定/解鎖操作有「方法」,則應將其編譯爲這些字節碼。所以,它實際上是的一個低級操作,並且與其他Java對象級別的實現非常不同。

同步是一個非常強大的合同。我認爲JLS的設計者不想讓這種可能性破壞這個合同。

Chapter 17 of the JLS描述了有關預期行爲的更多信息。

相關問題