根据我的理解,当我使用同步块时,它会获取对象的锁,并在代码块执行完毕后将其释放。在以下代码中:
public class WaitAndNotify extends Thread{
long sum;
public static void main(String[] args) {
WaitAndNotify wan = new WaitAndNotify();
//wan.start();
synchronized(wan){
try {
wan.wait();
} catch (InterruptedException ex) {
Logger.getLogger(WaitAndNotify.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Sum is : " + wan.sum);
}
}
@Override
public void run(){
synchronized(this){
for(int i=0; i<1000000; i++){
sum = sum + i;
}
notify();
}
}
}
如果运行方法内的同步块首先获取锁定,那么主方法内的同步块必须等待(不是因为wait(),而是因为另一个线程获取了锁定)。当运行方法执行完毕后,主方法将进入其同步块并等待通知,但它永远不会得到通知,这是我哪里误解了吗?
java.util.concurrent
中的类并不是“更高级”的:它们在_更高层次的抽象_上操作。编写生产代码的开发人员绝对应该使用更高级别的工具,但一个_学生_应该了解构建这些更高级别工具的基本原语。就像学习汇编语言的人在使用高级语言编写代码时做出更明智的决策一样,学习互斥锁、条件变量和原子操作的人在使用队列、线程池等工具时会更加得心应手。 - Solomon Slowfoo.wait()
调用中,foo.notify()
将不会起作用。 - Solomon Slow