2014-11-02 127 views
0

我有一个关于同步静态方法的问题。
如果我调用一个同步的静态方法,这是否意味着我锁定这个类和其他方法(包括静态或无静态)不能访问同步静态方法结束之前?调用synchronized静态方法,那么可以访问其他静态方法吗?

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

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

+0

一个静态同步'方法锁定类的'Class'对象声明静态方法。你的问题的答案直接源于此。 – 2014-11-02 10:35:43

+0

当同步的静态方法是锁定类对象时,为什么其他静态方法可以同时被调用? – wmmj23 2014-11-02 11:18:13

+0

如果2个方法是同一个类的方法,那么它不能。 – 2014-11-02 11:31:42

回答

1

我看你现在是问。

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

如果这两个方法都​​或使用​​块,他们是同样的事情同步(即在同一Class或相同this,那么你会得到相互排斥。

在你的榜样,一种方法不是​​(并且它不使用​​块),因此它不会被锁定。实际上,没有任何东西会锁定staticSleepNoSyn ......因为您已经写入了它

+0

我明白了。 'synchronized'不能限制no'synchronized'谢谢〜 – wmmj23 2014-11-02 12:39:09

相关问题