Java线程之间的通信

  1. volatile 变量的写 - 读

    这一点是利用了 volatile 写 和 读之间规则,也就是:volatile变量写完以后,会将写好的变量值立刻刷新到主存里面, volatile变量被读之前,会先从主存中里面读取这个 volatile变量的值,说到底,volatile变量 就是借助于规则和主存这两个必要条件来进行线程间的通信。如果 volatile 变量 和 其他变量都在一起,其他变量的值会随着 volatile变量 一起刷新到主存。对于其他变量的值,感觉就是抱着volatile变量大佬的腿进行线程之间安全的通信。
    图片来源互联网
    volatile 是怎么实现这种规则的呢?

    通过内存屏障禁止处理器重排序
    volatile 写 过程
    volatile 读过程
    解释一下内存屏障的指令

    内存屏障指令

  2. synchronized 关键字

    synchronized关键字本质上是利用 监视器进行通信,并且具有可见性排他性
    这里写图片描述

  3. 等待 / 通知机制
    等待通知机制和 消费者生产者模式很像,估计这也就是面试官为什么经常问这个问题的原因。这个模式的好处应该有两个:①,是一种线程之间的通信机制。②,这种模式在功能上实现解耦,在体系结构上具备了良好的伸缩性。

    notify() notifyAll()

    将等待队列中的等待线程从等待队列中移动到同步队列中

    wait() wait(long)

    线程状态由RUNNING 变为 WAITING状态

    WAIT Notify状态图

  4. 管道输入 / 输出流

    主要用于线程之间的数据传输。传输媒介为内存

  5. Thread.join() 的使用

  6. ThreadLocal 的使用

猜你喜欢

转载自blog.csdn.net/u013310517/article/details/80724739