簡體   English   中英

當我從同步中調用不同步的方法時,會出現什么?

[英]When I call a method not synchronized from a synchronized what appen?

如果我有兩個使用相同類C.java線程A和B,那么如果線程A使用訪問的同步方法( synchro() )使用另一個類方法( myMethod() ),並且在1ms或減去線程B之后嘗試執行操作,將會發生什么情況?使用myMethod()嗎? 他將等到線程A完成或它訪問myMethod()嗎? 線程A和線程B使用相同的類實例。

同步不是隱式可傳遞的 它僅僅是執行代碼塊的對象上的鎖。 它不會鎖定在代碼塊使用的對象。

線程B將有權訪問非同步方法。 由於未同步,因此線程B無需等待獲取對象監視器。

隱式互斥鎖僅在方法synchro()引入,而不會在myMethod()引入,因為myMethod()不同步。 因此,將無法在多個線程之間同步訪問myMethod()

它將訪問它。

僅同步方法或同步塊不能同時執行: 同步方法

沒有所謂的同步方法。

在我之后重復一遍: 沒有同步方法之類的東西

當您編寫此代碼時:

synchronized Foobar myFunk() { ... }

那只是語法糖,使您不必編寫以下代碼:

Foobar myFunk() {
    synchronized(this) { ... }
}

但是第二個讓事情變得更加明顯:不是同步的方法 ,而是對象

JVM不允許兩個不同的線程同時同步同一對象。 這就是全部 同步對象不會“鎖定”該對象(其他線程仍可以對其進行修改)。 同步對象不會阻止其他線程調用相同的方法。 這樣做是為了防止其他線程同時同步同一對象。

您如何使用該功能取決於您。

通常,您可以使用它來保護不變量 不變性是您對某個值或一值進行的斷言。 (例如,列表L的長度始終為偶數)。 如果一個線程必須暫時破壞不變式(例如,首先將一件事添加到列表中,然后再添加另一件事),則其他線程如果看到破壞的不變式,則將崩潰並燃燒; 那么您需要同步。

第一個線程僅在同步塊內時打破不變式,而其他任何線程僅在同一對象上同步時才查看數據。 這樣,外觀就永遠看不到處於破碎狀態的不變性。

暫無
暫無

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

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