Java线程基础(三):线程调度以及wait/notify – kiwi

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

当你成功得意的时候,最重要的是瞧得起别人。

Java线程基础(三):线程调度以及wait/notify – kiwi

相关文章:

你感兴趣的文章:

标签云: