我有一個關於同步靜態方法的問題。
如果我調用一個同步的靜態方法,這是否意味着我鎖定這個類和其他方法(包括靜態或無靜態)不能訪問同步靜態方法結束之前?調用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