正确使用Object.wait和Object.notify

1. 前言

现在的代码实现里面几乎不用Object.wait和Object.notify了,但是对其进行学习还是有助于理解为啥他们被Locksupport.park和unpark替换了。

2. 使用汇总

关于完整使用,参考文章:如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

文章中使用wait的生产者和消费者例子可以看看。

主要要点是:

对需要线程间互斥的对象用synchronized,持有其监视器锁

永远在循环(loop)里调用 wait 和 notify, 主要避免条件不满足是就被虚假唤醒,......

聊聊Locksupport

1. 为啥有Locksuppot

看看Locksupport的源码中的注释可知,Locksupport是实现别的锁和同步类的基本原语。

Basic thread blocking primitives for creating locks and other synchronization classes.

该类native实现是依靠posix OS接口来搞的(pthread.h),类似以前操作系统课程学习的互斥锁。

class Parker : public os::PlatformParker {

private:

volatile int _counter ;

.........

关于java中的interrupt

1. interrupt知识点

PS: 以下总结基于JDK8

本文不会完整说明interrupt,只会罗列一些比较重要的点。完整了解Thread.interrupt可以看参考资料。

以下的一些理解新的有助于理解参考资料的文章:

interrupt方法调用后,针对BLOCKED状态的线程,只是设定中断标志位为true。是否响应中断(感知这个标志位的变化)取决于API的设计。JDK的阻塞IO API、Synchronized同步块、还有Lock中的很多方法(不包括lockInterruptibly)都是不响应中断的。当然调用线程可以利用标志位判断来使得自己设计的API是......