java内存模型

1、并发编程中有两个关键问题:线程通信和线程同步
a、线程通信:是指线程之间通过何种机制来进行信息的交换
b、线程同步:是指用于控制线程之间操作发生的相对顺序的机制
线程通信可以通过共享内存和消息传递,在共享内存的并发模型里,线程之间通过对共享内存的读写进行隐式通信,但是线程同步必须是显式的。java并发采用的是共享内存的模型。

2、java内存模型(JMM)是一种抽象模型,它定义了线程和主内存之间的关系,线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存存储了该线程的共享变量的副本。

3、重排序:java程序从源代码到汇编指令,为了提高性能,编译器和处理器往往会对指令进行重排序。
a、编译器重排序:编译器在不改变单线程程序语义的前提下,会重新安排语句的执行顺序。
b、处理器重排序:处理器将多条指令重叠执行,在不存在数据依赖的情况下,处理器可以改变语句对应机器指令的执行顺序
c、内存系统的重排序:由于处理器使用读写缓冲区,这使得加载和存储操作看上去可能是乱序执行的

4、先行发生原则(happens-before):一个操作对另一个操作是可见的,不管怎么重排序,保证单线程的程序执行结果不能被改变,还能保证正确同步的多线程程序执行结果不被改变。

5、as-if-serial语义:不管怎么重排序(编译器和处理器重排序),单线程的执行结果不改变

6、数据依赖:两个操作访问同一个变量,并且有一个是写操作,这两个操作之间存在数据依赖。
7、控制依赖:有控制条件的关系

8、顺序一致性模型:
a、一个线程中的所有操作必须按照程序的顺序来执行
b、所有线程都只能看到一个单一的操作执行顺序,每个操作都必须原子执行且对所有线程立即可见

9、锁不仅对临界区有互斥的作用,还有内存语义,释放锁的时候会把共享变量的值刷新到主内存,获取锁的时候共享变量值的读取直接从内存里面拿
释放锁的内存语义和volatile写的内存语义相同,获取锁的内存语义和volatile读的内存语义相同

10、concurrent包的实现:
底层使用CAS加volatile变量
上层使用AQS、非阻塞数据结构和院子变量类来实现
对外提供Lock、同步器、阻塞队列、Executor和并发容器

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