我对同步静态方法有疑问 如果我调用同步静态方法,是否意味着我锁定此类,并且在同步静态方法结束之前无法访问其他方法(包括静态或无静态)?
当同步静态方法锁定类对象时,为什么可以同时调用其他静态方法?
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 :(得分:1)
我现在看到你在问什么。
如果我调用同步静态方法,是否意味着我锁定此类,并且在同步静态方法结束之前无法访问其他方法(包括静态或无静态)?
如果两种方法都是synchronized
或使用synchronized
块,并且他们正在同一事物上进行同步(即同一Class
或同一this
,那么你将会互相排斥。
在您的示例中,一个方法不是synchronized
(并且它不使用synchronized
块)因此,它不会被锁定。事实上,没有任何东西可以锁定staticSleepNoSyn
...正如你所写的那样。