调用同步静态方法,然后可以访问其他静态方法?

时间:2014-11-02 10:27:35

标签: java

我对同步静态方法有疑问 如果我调用同步静态方法,是否意味着我锁定此类,并且在同步静态方法结束之前无法访问其他方法(包括静态或无静态)?

当同步静态方法锁定类对象时,为什么可以同时调用其他静态方法?

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睡眠
  结束静态睡眠

1 个答案:

答案 0 :(得分:1)

我现在看到你在问什么。

  

如果我调用同步静态方法,是否意味着我锁定此类,并且在同步静态方法结束之前无法访问其他方法(包括静态或无静态)?

如果两种方法都是synchronized或使用synchronized块,并且他们正在同一事物上进行同步(即同一Class或同一this,那么你将会互相排斥。

在您的示例中,一个方法不是synchronized(并且它不使用synchronized块)因此,它不会被锁定。事实上,没有任何东西可以锁定staticSleepNoSyn ...正如你所写的那样。