⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

对象是否在多线程中共享

可见性

发布与逸出

多线程共享该对象,
可以看到最新结果

由于JMM内存模型,因此存在多种问题

  1. 失效数据 - get或set操作并非真正修改了
    主内存的数据,可能仅仅修改了寄存器,导致对
    其他线程不可见
  2. 非原子的64位操作 - 64位分解成两个32位操作

出现的问题

Synchronized

实现方法1

volatile

实现方法2

让其他线程都看到

线程封闭

  1. Ad-hoc 线程封闭
  2. 栈封闭
  3. ThreadLocal 类

不变性

对象不可变,即可多线程中共享

线程各自用各自的

  1. final 构建不可变对象
  2. volatile 发布不可变对象

安全发布

安全发布的常用模式

三种对象类型

  1. 不可变对象
  2. 事实不可变对象
  3. 可变对象