Java内存模型

Java内存模型学习
内存模型

Java内存模型主要由JMM控制,JMM决定了一个线程对共享变量的写入何时对另一个线程可见。
JMM定义了线程和主内的抽象关系:线程的共享变量存在主存,每一个线程都有私有的本地内存。

指令重排序

编译器和处理器常常会对指令进行重排序

内存屏障

JMM的处理器的重排序规则要求对Java编译器在生成指令序列时,插入特定的内存屏障,禁止指令重排序来保证内存一致性。

Happens-before 规则

在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。

as-if-serial语义

as-if-serial语义的意思是:不管怎么重排序,单线程的程序执行结果不能被改变。

顺序一致性内存模型

1 一个线程中的所有操作必须按照程序的顺序来执行
2 所有线程都只能看到一个单一的操作执行顺序,在顺序一致性的内存模型中,每一个操作都必须原子性执行且立即对所有线程可见。

volitale的内存语义

当声明一个共享变量为volitale后,对这个变量的读写将会很特别。

  • 可见性
    对一个volatile变量的读,总是能看到任意线程对这个volitale变量的写入
  • 原子性
    对任意单个volitale变量的读/写具有原子性,但类似volitale++这种复合操作不具有原子性

volitale对应的内存语义:
当写一个volitale变量时,JMM会把该线程对应的本地内存中的共享变量的值刷新到主内存。

final域的内存语义
  • 1 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能被重排序
  • 2初次读一个包含final域的对象的引用,与随后初次读到这个final域,这两个操作之间不能重排序

参考资料:
Java并发编程的艺术

你可能感兴趣的:(Java内存模型)