繁体   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