高并发内存模型

  • 编译器生成的指令顺序与源代码顺序不通
  • 编译器把变量保存在寄存器而不是内存
  • 处理器可以采用乱序并行方式来执行指令
  • 缓存可能改变写入变量提交到主内存次序
  • 保存在处理器本地缓存的值对其他处理器不可见
    在多线程环境中,维护程序串行性导致很大性能开销,对于并发程序线程来说,大部分时间执行各自任务,线程协调会减低运行速度。
    每个处理器有自己缓存,并定期与主内存协调。
    重排序调度器采用不恰当方式交替执行不同线程操作,将导致不正确结果。JMM导致不同线程看见的操作执行顺序不同。没有同步,推断执行顺序非常困难
    java内存模型一个变量被多读一写的话,没有安规排序,产生数据竞争问题。
    高并发内存模型

A和B分别按照源程序先后顺序排序,如果A和B获得不同的锁,无法判断两个线程先后。

高并发内存模型

@Immutable : 表示类不可变,博阿寒@ThreadSafe含义
@ThreadSafe
@NotThreadSafe: 可选,如果类非线程安全,可以加上。
@GuardedBy(lock) 表示只有持有某个特定锁时才能访问
lock取值包括

  • @GuardedBy(“this”)表示在包含对象上的内置锁
  • @GuardedBy(“fieldName”)表示与fieldName引用的对象相关联的锁,可以说一个隐式锁,也可显示锁
  • @GuardedBy(“Class Name.filedName”),类似于@GuardedBy(“fieldName”),指向另一个类的静态域中持有的锁对象
  • @GuardedBy(“methodName()”)指的通过调用命名方法返回锁对象
  • @GuardedBy(“ClassName.class”)指命名类的字面量对象
    这玩意有助于代码的维护与审查,能通过一些自动化分析工具找出潜在的线程安全性错误。