[英]what happens when you call a synchronized from a non-synchronized method in java
[英]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.