簡體   English   中英

多線程使用的Java同步和靜態同步方法

[英]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
            }
}

這非常令人困惑,請幫忙。 提前致謝。

不正確。 由於m2synchronized ,因此無論synchronized方法m1處於什么狀態,嘗試調用它時都不會阻塞任何線程。

獲取對象上的鎖不會阻止對該對象的訪問,而只是阻止另一個線程同時獲取同一對象上的鎖的能力。 如果另一個線程不嘗試獲取該鎖,則不會被阻塞。

現在我的理解是,如果T2嘗試訪問非同步方法m2(),它將被阻塞,因為當前對象鎖定在T1上

m2()未同步,因此沒有阻止它的內容。 這就是同步方法和非同步方法之間的區別。

當線程嘗試輸入同步方法時,它將阻塞直到可以獲取適當的監視器(鎖定)。 退出該方法時,它將釋放鎖定。 對於非同步方法,這些步驟均不會發生。

(順便說一句,我個人建議大多數情況下完全不使用同步方法。相反,在該類內是已知的引用上該方法進行同步。這樣可以更輕松地進行代碼推理,因為只有您的班級才能獲得該鎖。)

你錯了。 對象不會被synchronized塊“鎖定”,唯一發生的事情是,其他試圖獲取該對象監視器的synchronized塊必須等待。

綜上所述: synchronized對非同步代碼絕對沒有阻塞作用。

線程進入同步方法/塊時將獲得鎖。 由於m2()不同步,它將由線程2執行。請記住,只有在存在同步方法時,鎖才會出現

暫無
暫無

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

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