​ 我在《同步语义-volatile》一文中提到过共享内存和消息传递线程中的两种通信机制,但是在Java线程中的通信方式存在很多种,在这里整理了一下。

共享内存

​ 通过设置共享变量,多个进程来访问共享变量,从而隐式的达到线程间的通信。

等待/通知机制

​ 是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作。等待/通知机制是一种很典型的消息传递的机制。

经典范例

等待方

获取对象的锁
如果条件不满足,调用对象的wait()方法,被通知后仍要检查条件
条件满足执行对应逻辑

伪代码
synchronized(对象) {
while(条件不满足) {
对象.wait();
}
对应的处理逻辑
}

通知方

获得对象的锁
改变条件
通知所有等待在对象上的线程

伪代码
synchronized(对象) {
改变条件
对象.notifyAll();

管道

​ 管道输入/输出和普通的文件输入/输出流或者网络输入/输出流不同之处在于它用于线程之间的数据传输,传输媒介为内存。

同步

​ 在Java中,线程之间的同步也就是通过volatile和synchronized关键字来进行数据同步。