改寫爲清楚的對象使用了synchronized塊隱式鎖我爲什麼不能直接訪問(和鎖)
我想能夠使用synchronized塊有更明確的鎖定混合通過在適當時直接調用鎖定和釋放方法。因此,當我可以脫身使用sychtronized(myObject)時,允許我使用sysyxtically的syntaxtical糖,但也可以調用myObject.lock & myObject.unlock在當一個同步塊的靈活性不足以滿足我需要的時候完成。
我知道每一個對象都隱含着一個內置於其中的由同步塊使用的租賃鎖。實際上,每次進入同步塊時,對象內部的可重入鎖都會鎖定鎖方法,並且當您離開同步塊時會在同一個可重入鎖上調用解鎖。我似乎很容易讓一個人能夠手動鎖定/解鎖這個隱式的可重入鎖;從而允許混合同步塊並顯示鎖定。
但據我所知,沒有辦法做到這一點。由於同步塊的工作方式,我不相信有一種方便的方法將它們與明確的鎖定相混合。看起來好像這將是一個相當方便,並且可以通過擴展Object api來添加鎖定/解鎖方法來輕鬆添加。
我的問題是,爲什麼不存在?我確定有一個原因,但我不知道它是什麼。我認爲這個問題可能與封裝有關;同樣的原因,你不想做同步(這)。然而,如果我已經調用了sycnhronized(myObject),那麼通過定義,任何知道myObject的人都可以同步它,並在愚蠢的情況下導致死鎖。封裝問題取決於誰可以訪問您同步的對象,而不管您使用sychtronized塊還是手動鎖定對象;至少在我看到它的時候。那麼是否還有其他一些優勢不允許手動鎖定對象?
只是要清楚(並防止像我現在刪除的和其後的那個答案),你說你想在同一臺顯示器上同步,但你**不要**想要使用'synchronize'語句。你希望(有效地)獲得某種監視器對象,並調用一個'lock'方法,執行其他邏輯並調用'release'。所以這不是關於同步方法與同步塊的問題,而是關於通過顯式「鎖定」和「釋放」「調用」來使用同一監視器的問題。 – 2013-04-10 13:32:28
現在我不確定他想知道什麼,最後一段作爲一個高級面向對象設計主題是有意義的,第一段是初學者在線程安全方面的問題;在他的中間段,他講述了sycronized的塊,他可能意味着同步的方法,或者同步這個。所有有點混淆 – AlexWien 2013-04-10 13:51:38
是TJ,我在問你在說什麼。對不起,如果我沒有說好,我想不出如何表達我想要的東西 – dsollen 2013-04-10 16:17:06