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