【发布时间】:2014-07-31 20:46:44
【问题描述】:
我有以下代码:这是为了了解信号量。代码是线程A首先从b.wait()开始等待(使调用线程休眠),然后得到通知,为什么代码在这里同步?如果否,则给出 IllegalMontiorXXXXXXXXX 异常。
public 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){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread{
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
编辑:答案是同步让当前线程拥有信号量。 notify() 文档解释了这一点。
【问题讨论】:
-
您阅读过
wait()和notify()的文档吗? -
顺便说一下,在线程对象上同步和等待通常是个坏主意。当你可以打电话给
notifyAll()时,你也可以打电话给notify()。notify()有道理的情况很少,最好是安全的。 -
@JonSkeet 谢谢,同步是为了让信号量的线程所有者如文档所述。
标签: java multithreading semaphore