[英]Java Synchronized and static synchronized method used by Multiple Threads
我一直對以下情況感到困惑
MyClass只有一個對象,並且有兩個線程T1,T2。 現在有一個線程說T2將能夠使用同步方法m1(),該方法具有唯一的MyClass對象鎖,而其他線程T2如果嘗試訪問m1()則將被阻塞。
現在我的理解是,如果T2將嘗試通過訪問靜態共享字段來訪問靜態同步方法m2(),則它將被阻塞,因為當前對象鎖定在T1上,並且將無法執行m2(),並且如果MyClass有兩個對象那么T2線程將能夠訪問m1()。 我是對還是錯?
class MyClass
{
public static int i = 5;
public synchronized void m1()
{
System.out.println(i); //uses static field i of MyClass
//T1 is executing this method
}
public static synchronized void m3()
{
//T2 will be able to call this method on same object lock while it is using
//static field i???
System.out.println(i);//uses static field i of MyClass
}
}
這非常令人困惑,請幫忙。 提前致謝。
不正確。 由於m2
不synchronized
,因此無論synchronized
方法m1
處於什么狀態,嘗試調用它時都不會阻塞任何線程。
獲取對象上的鎖不會阻止對該對象的訪問,而只是阻止另一個線程同時獲取同一對象上的鎖的能力。 如果另一個線程不嘗試獲取該鎖,則不會被阻塞。
現在我的理解是,如果T2嘗試訪問非同步方法m2(),它將被阻塞,因為當前對象鎖定在T1上
否m2()
未同步,因此沒有阻止它的內容。 這就是同步方法和非同步方法之間的區別。
當線程嘗試輸入同步方法時,它將阻塞直到可以獲取適當的監視器(鎖定)。 退出該方法時,它將釋放鎖定。 對於非同步方法,這些步驟均不會發生。
(順便說一句,我個人建議大多數情況下完全不使用同步方法。相反,在該類內僅是已知的引用上在該方法內進行同步。這樣可以更輕松地進行代碼推理,因為只有您的班級才能獲得該鎖。)
你錯了。 對象不會被synchronized
塊“鎖定”,唯一發生的事情是,其他試圖獲取該對象監視器的synchronized
塊必須等待。
綜上所述: synchronized
對非同步代碼絕對沒有阻塞作用。
線程進入同步方法/塊時將獲得鎖。 由於m2()不同步,它將由線程2執行。請記住,只有在存在同步方法時,鎖才會出現
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.