线程之间如何通信?

java 线程通信是将多个独立的线程个体进行关联处理,使得线程与线程之间能够进行相互通信。比如线程 A 修改了对象的值,然后通知给线程 B,使线程 B 能够知道线程 A 修改的值,这就是线程通信。
volatile
volatile 是轻量级的同步机制,volatile 保证变量对所有线程的可见性,不保证原子性。

  1. 当对 volatile 变量进行写操作的时候,JVM 会向处理器发送一条 LOCK 前缀的指令,将该变量所在缓存行的数据写回系统的内存。
  2. 由于缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己的缓存是不是过期了,当处理器发现自己的缓存行对应的内存地址被修改,就会将当前处理器的缓存行置为无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存中。
    MESI(缓存一致性协议):当 CPU 写数据时,如果发现操作的变量是共享变量,即在其他 CPU 中也存在该变量的副本,会发出信号通知其他 CPU 将该变量的缓存行置为无效状态,因此当其他 CPU 需要读取这个变量时,就会从内存重新读取。
    volatile 关键字的两个作用:
  3. 保证了不同线程对共享变量进行操作时的可见性。即一个线程修改了某个变量的值,新的值对其他线程来说是立即可见的。
  4. 禁止指令重排。
    指令重排序是 JVM 为了优化指令,提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度。Java 编译器会在生成指令系列时在适当的位置插入 内存屏障 指令来禁止处理器重排序。插入一个内存屏障,相当于告诉 CPU 和编译器先于这个命令的必须先执行,后于这个命令的必须后执行。对一个 volatile 字段进行写操作,Java 内存模型将在写操作后插入一个写屏障指令,这个指令会把之前的写入值都刷新到内存中。

synchronized

wait/notify(等待通知)机制
一个线程调用 Object 的 wait() 方法,使其线程被阻塞;另一个线程调用 Object 的 notify()/notifyAll() 方法,wait() 阻塞的线程继续执行。
● wait():让当前线程释放对象锁并进入等待(阻塞)状态。
● notify():唤醒一个正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到 CPU 的执行。
● notifyAll():唤醒所有正在等待相应对象锁的线程,使它们进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到 CPU 的执行。

相关推荐

  1. 线之间如何通信

    2024-02-08 15:32:02       53 阅读
  2. 面试高频知识点:2线 2.1.6线之间如何通信

    2024-02-08 15:32:02       42 阅读
  3. socket在两个线之间进行通信

    2024-02-08 15:32:02       56 阅读
  4. 线通信同步

    2024-02-08 15:32:02       32 阅读
  5. 线通信机制

    2024-02-08 15:32:02       40 阅读
  6. 线通信

    2024-02-08 15:32:02       26 阅读
  7. A类中创建posix线线如何通信

    2024-02-08 15:32:02       54 阅读
  8. 如何创建线

    2024-02-08 15:32:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-08 15:32:02       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-08 15:32:02       97 阅读
  3. 在Django里面运行非项目文件

    2024-02-08 15:32:02       78 阅读
  4. Python语言-面向对象

    2024-02-08 15:32:02       88 阅读

热门阅读

  1. NMEA GPS

    2024-02-08 15:32:02       42 阅读
  2. 系统架构22 - 软件架构设计(1)

    2024-02-08 15:32:02       49 阅读
  3. 【C/C++ 16】C++11线程库

    2024-02-08 15:32:02       50 阅读
  4. 前端bug手册

    2024-02-08 15:32:02       50 阅读
  5. react中的diff算法

    2024-02-08 15:32:02       54 阅读
  6. 线程和进程的区别及基础线程创建

    2024-02-08 15:32:02       50 阅读
  7. pandas dataframe写入excel的多个sheet页面

    2024-02-08 15:32:02       52 阅读
  8. Debian系统中挂载一个数据盘

    2024-02-08 15:32:02       52 阅读
  9. 有道论文翻译接口,python版和lua版

    2024-02-08 15:32:02       58 阅读
  10. [Android] Client->NuPlayer

    2024-02-08 15:32:02       52 阅读
  11. work day7

    2024-02-08 15:32:02       52 阅读
  12. 【mybatis自动治愈插件】

    2024-02-08 15:32:02       49 阅读
  13. LeetCode 二叉树/n叉树的解题思路

    2024-02-08 15:32:02       63 阅读