線程通信的四種方式

線程之間為什麼要通信?

通信的目的是為瞭更好的協作,線程無論是交替式執行,還是接力式執行,都需要進行通信告知。那麼java線程是如何通信的呢,大致有以下四種方式。

Java線程的通信方式

  1. volatile
  2. 等待/通知機制
  3. join方式
  4. threadLocalvolatile關鍵字方式

volatile有兩大特性,一是可見性,二是有序性,禁止指令重排序,其中可見性就是可以讓線程之間進行通信。

volatile語義保證線程可見性有兩個原則保證

  • 所有volatile修飾的變量一旦被某個線程更改,必須立即刷新到主內存
  • 所有volatile修飾的變量在使用之前必須重新讀取主內存的值

volatile保證可見性原理圖

工作內存2能夠感知到工作內存1更新a值是靠的總線,工作內存1在將值刷新的主內存時必須經過總線,總線就能告知其他線程有值被改變,那麼其他線程就會主動讀取主內存的值來更新。

示例

/**
*
* @author wengyz
* @version VolatileDemo.java, v 0.1 2020-04-12 22:09
*/
public class VolatileDemo {

private static volatile boolean flag = true;

public static void main(String[] args) {

new Thread(new Runnable() {
@Override
public void run() {
while (true){
if (flag){
System.out.println("trun on");
flag = false;
}
}
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
while (true){
if (!flag){
System.out.println("trun off");
flag = true;
}
}
}
}).start();
}
}

赞(0)