簡體   English   中英

在Java中使用同步塊來一次阻止對多個方法的訪問

[英]Using synchronized block in java to block access to multiple methods at once

如果我有兩種方法:

public class A {

    public void doSomething() {
        synchronized(A.class) {
            //synchronized block here
        }
    }

    public void doSomethingElse() {
        synchronized(A.class) {
           //synchronized block here
        }
    }
}

所以我的問題是, A.class像全局鎖一樣起作用? 意思是一個線程執行方法doSomething()會被阻塞,而另一個線程正在執行doSomethingElse()嗎?

謝謝。

A.class像全局鎖一樣起作用嗎?

任何synchronized塊都會鎖定特定對象。 A.class鎖定充當您正在其中運行的ClassLoader的“全局”鎖定,因為Java保證每個加載器中只有一個A.class對象實例。 A.class是一個對象,就像new A()是一個對象一樣。

鎖定A.class與鎖定靜態方法相同:

public class A {
    public static synchronized void someStaticMethod() {
        // in here you are locked on A.class as well
    }
    public void doSomething() {
        synchronized (A.class) {
            // this block is locked on the same object as someStaticMethod()
        }
    }
}

為了進行比較,當您鎖定實例方法(而不是靜態方法)時,它與鎖定正在執行的A實例相同。 換句話說this

public class A {
    public synchronized void someInstanceMethod() {
        // in here you are locked on the instance of A (this)
    }
    public void doSomething() {
        synchronized (this) {
            // this block is locked on the same instance of A
        }
    }
}

同樣,它與所討論的特定對象有關。 這是有關lockJava文檔

您的示例將從所有由同一類加載器加載的A類的所有實例中獲取該鎖的方法中鎖定線程,因此,如果任何一個線程獲取了阻止所有其他線程訪問該對象上的那些方法中的任何一個的鎖。或該類的任何其他對象。 通常,設置類似這樣的操作可能不是一個好主意。 鎖定將不必要地進行粗粒度處理(即使線程只希望訪問屬於不同實例且不會共享的數據),也會導致線程等待),並且會嚴重限制並發性。 如果您有一個實際需要的設計,則應該質疑您的設計。

它獲得對象鎖定,所有其他線程將被阻塞,直到current thread releases the lock為止。 根據java規范:

同步方法在執行之前先獲取一個監視器(第17.1節)。 對於類(靜態)方法,使用與該方法的類的Class對象關聯的監視器。 對於實例方法,使用與此相關聯的監視器(為其調用方法的對象)

暫無
暫無

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

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