簡體   English   中英

調用同步的靜態方法,然后可以訪問其他靜態方法嗎?

[英]invoke synchronized static method,then can other static methods be accessed?

我對同步靜態方法有疑問。
如果我調用同步靜態方法,是否表示我鎖定了此類並且在同步靜態方法結束之前無法訪問其他方法(包括靜態或非靜態)?

當一個同步靜態方法鎖定類對象時,為什么可以同時調用另一個靜態方法?

class Y {
    static synchronized void staticSleep() {
        System.out.println("Start static sleep");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        System.out.println("End static sleep");
    }
    static void staticSleepNoSyn() {
        System.out.println("Start static NoSyn sleep");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        System.out.println("End static NoSyn sleep");
    }
} 

public class X {
    public static void main(String[] args) {
        for (int i = 0; i < 2; ++i) {
            new Thread(new Runnable() {

                public void run() {
                    Y.staticSleep();
                }
            }).start();
        }

        for (int i = 0; i < 10; ++i) {
            new Thread(new Runnable() {

                public void run() {
                    Y.staticSleepNoSyn();
                }
            }).start();
        }
    }
}

輸出:

開始靜態睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
開始靜態NoSyn睡眠
結束靜態睡眠
開始靜態睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態NoSyn睡眠
結束靜態睡眠

我明白你現在在問什么。

如果我調用同步靜態方法,是否表示我鎖定了此類並且在同步靜態方法結束之前無法訪問其他方法(包括靜態或非靜態)?

如果這兩種方法都已synchronized或使用synchronized塊,並且它們在同一事物(即同一Classthis上同步,那么您將互斥。

在您的示例中,一種方法未synchronized (並且不使用synchronized塊),因此不會被鎖定。 實際上,沒有什么能像您編寫的那樣鎖定staticSleepNoSyn ...。

暫無
暫無

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

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