簡體   English   中英

為什么我不能直接訪問(並鎖定)對象用於同步塊的隱式鎖

[英]Why can't I directly access (and lock) the implicit lock that Objects use for synchronized block

為清楚起見改寫

我希望能夠通過在適當的時候直接調用鎖和釋放方法來將同步塊的使用與更顯式的鎖混合使用。 因此,當我可以使用sychtronized(myObject)時,可以使用語法上的優勢,但是當同步塊不夠靈活而無法執行我所需的時間時,也可以分別調用myObject.lock和myObject.unlock完成。

我知道每個對象都暗含一個內置的租用鎖,該鎖由同步塊使用。 實際上,每次進入同步塊時,鎖方法都會在對象內部可重入鎖上進行計算,並且在離開同步塊時,將在同一可重入鎖上調用解鎖。 我似乎似乎很容易允許手動鎖定/解鎖這種隱式可重入鎖定; 因此,允許混合使用同步塊和明確鎖定。

但是,據我所知沒有辦法做到這一點。 而且由於同步塊的工作方式,我不相信有一種方便的方法可以將它們與顯式鎖定的齒形相混合。 似乎這將是相當方便的,並且可以通過擴展Object api來添加鎖定/解鎖方法來輕松添加。

我的問題是,為什么不存在? 我確定是有原因的,但是我不知道這是什么。 我認為問題可能與封裝有關。 同樣的原因,你不想做同步(這個)。 但是,如果我已經在調用sycnhronized(myObject),那么通過定義,任何了解myObject的人都可以在其上進行同步,並且如果愚蠢地進行操作也會導致死鎖。 封裝問題歸結為誰可以訪問同步的對象,而不管您使用同步塊還是手動鎖定對象。 至少在我看來。 那么,不允許人們手動鎖定對象還有其他好處嗎?

某個對象的鎖與實例本身緊密相關。 synchronized塊和方法的結構非常嚴格。 如果作為程序員,您有可能干擾系統(虛擬機),則可能會導致嚴重的問題。

  • 您最終可以釋放由synchronized塊創建的鎖
  • 您創建另一個synchronized塊將釋放的鎖
  • 您創建的鎖條目多於出口
  • 您創建的鎖出口多於條目

甚至為lockrelease操作定義了特定的字節碼。 如果對此鎖定/解鎖操作有“方法”,則應將其編譯為這些字節碼。 因此,這實際上是一個低級操作,與其他Java對象級實現有很大不同。

同步是一個非常強大的契約。 我認為JLS的設計者不想讓這種合同違約的可能性。

JLS第17章詳細介紹了預期的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM