time-sliceing & yield
(placeholder)
wait/notify
Java中Object类实现了两个方法:wait以及notify,这样所有的java对象都含有了这两个方法。
调用wait或者notify的时候,当前线程必须要是对象lock的拥有者,否则会抛出IllegalMonitorStateException异常。(为什么???)
share.wait(); //IllegalMonitorStateException
正确的写法:
synchronized (share) {
share.wait();
}
当线程在synchronized中调用了share.wait()时,在放弃了CPU的同时,也放弃了share这个对象的lock,进入这个对象的wait pool。
当另外一个线程调用了share.notify()时,将从wait pool中拿出一个线程,让该线程获得lock,并继续执行。
这也就是为什么wait/notify需要加锁的原因。
为什么wait/notify需要加锁
http://stackoverflow.com/questions/2779484/why-must-wait-always-be-in-synchronized-block
这个链接中的解释是很好的
其他:
noitfyall,虽然可以唤醒所有线程,但是每个线程单独执行的时候,仍然是需要获取lock的。
参考资料:
http://www.javaworld.com/article/2071214/java-concurrency/java-101--understanding-java-threads--part-3--thread-scheduling-and-wait-notify.html
http://www.rapidprogramming.com/tutorial/JAVA-The-wait-notify-Mechanism-in-java-133
http://stackoverflow.com/questions/2779484/why-must-wait-always-be-in-synchronized-block