我有一个关于同步静态方法的问题。
如果调用同步静态方法,是否意味着在同步静态方法结束之前不能访问该类和其他方法(包括静态方法或不静态方法)?
当同步静态方法是锁定类对象时,为什么可以同时调用其他静态方法?
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睡眠 结束静态睡眠
发布于 2014-11-02 12:19:06
我明白你现在的要求了。
如果调用同步静态方法,是否意味着在同步静态方法结束之前不能访问该类和其他方法(包括静态方法或不静态方法)?
如果这两种方法都是synchronized
或使用synchronized
块,并且它们在同一件事情上同步(即相同的Class
或相同的this
),那么您将得到互斥。
在您的示例中,有一个方法不是synchronized
(而且它不使用synchronized
块),因此它不会被锁在门外。事实上,没有什么能阻止staticSleepNoSyn
.正如你所写的。
https://stackoverflow.com/questions/26698305
复制相似问题