[英]understanding synchronized in java
为什么通常线程样本在同步块中放入这么多代码。 根据我的理解,在以下情况下,synchronized仅用于锁定b以便进行等待和通知:
主类ThreadA:
class ThreadA {
public static void main(String [] args) {
ThreadB b = new ThreadB();
b.start();
synchronized(b) {
try {
System.out.println("Waiting for b to complete...");
b.wait();
} catch (InterruptedException e) {}
System.out.println("Total is: " + b.total);
System.out.println(Thread.currentThread().getName());
}
}
}
和ThreadB类:
class ThreadB extends Thread {
int total;
public void run() {
synchronized(this)
{
System.out.println();
for(int i=0;i<100;i++)
{
System.out.println(Thread.currentThread().getName());
total += i;
}
notify();
}
}
}
如果我只wait
并在synchronized
块中进行notify
,将会发生什么变化:
class ThreadA {
public static void main(String [] args) {
ThreadB b = new ThreadB();
b.start();
try {
System.out.println("Waiting for b to complete...");
synchronized(b) { b.wait();}
} catch (InterruptedException e) {}
System.out.println("Total is: " + b.total);
System.out.println(Thread.currentThread().getName());
}
}
根据我的理解,在以下情况下,同步仅用于锁定b以等待和通知
您的理解是错误的。
synchronized
还用于:
如果我只等待并在同步块中进行通知,将会发生什么变化:
在这种特殊情况下,它会根据竞争条件而有所不同-在原始代码中,如果新thread
在原始线程中到达同步块之前开始执行,则不会达到“等待b”完成”,直到第二个线程结束...这时它将永远处于wait
。
请注意,这是要等待一个非常糟糕的主意 Thread
监控,如wait/notify
是由内部使用Thread
。
总之,你使用的示例是一个坏的开始以各种方式-但同步用于不仅仅是wait/notify
。
请注意, total += i
在Java中不是原子操作。 因此,您还必须同步此构造。
您也不必同步notify()和wait(),因为它们的锁是在内部处理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.