我有一个关于同步静态方法的问题。
如果我调用一个同步的静态方法,这是否意味着我锁定这个类和其他方法(包括静态或无静态)不能访问同步静态方法结束之前?调用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睡觉
结束静态睡眠
一个静态同步'方法锁定类的'Class'对象声明静态方法。你的问题的答案直接源于此。 – 2014-11-02 10:35:43
当同步的静态方法是锁定类对象时,为什么其他静态方法可以同时被调用? – wmmj23 2014-11-02 11:18:13
如果2个方法是同一个类的方法,那么它不能。 – 2014-11-02 11:31:42