public class B {
public static String lock = "a";
public static void main(String[] args) {
MyThread t1 = new MyThread("Thread 1");
t1.start();
lock = "b";
MyThread t2 = new MyThread("Thread 2");
t2.start();
lock = "c";
MyThread t3 = new MyThread("Thread 3");
t3.start();
lock = "d";
MyThread t4 = new MyThread("Thread 4");
t4.start();
}
}
class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
@Override
public void run() {
synchronized (B.lock){
System.out.println(Thread.currentThread().getName() +" is going to sleep for 5 seconds");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " done sleeping ");
}
}
}
輸出::爲什麼不是所有線程都同時啓動?
Thread 1 is going to sleep for 5 seconds
Thread 2 is going to sleep for 5 seconds
Thread 2 done sleeping
Thread 1 done sleeping
Thread 4 is going to sleep for 5 seconds
Thread 4 done sleeping
Thread 3 is going to sleep for 5 seconds
Thread 3 done sleeping
對不起,我不清楚的問題。但我的查詢是因爲我在每次線程啓動後都更改鎖對象,爲什麼不是所有線程都同時啓動並鎖定不同的字符串對象?我猜想可能是操作系統線程調度的原因。但每次執行都會導致僅同時啓動2個線程(1 & 2),而其餘2個線程(3 & 4)等待獲取鎖定。但爲什麼 ?
它們不會同時啓動,因爲您沒有提供任何機制讓它們同時啓動。 –
備註:請不要將字符串文字用作* locks *。如果你有多個類的代碼,你的*性能工程師會有一個名爲「程序太慢」的sev-1缺陷。接下來,你的預期輸出是什麼? – TheLostMind
另外,在每個線程啓動之後對'lock'變量的賦值基本上會使'synchronized(B.lock)'結構失效。當線程1進入同步塊時,它擁有字符串「a」上的監視器。但是,您隨後用「b」覆蓋鎖定,因此當線程2進入同步塊時,它會獲取「b」上的監視器,並且能夠立即進入該塊。你爲什麼要改變'lock'變量的值? – schtever