并发编程艺术-3
2018-04-14 本文已影响0人
e86dab508bc1
本文主要简单介绍Java 内存模型的基础和相关概念,重排序和顺序一致性内存模型,同步原语 synchronized,volatile和final。
JAVA 线程之间通过java内存模型(JMM)控制
java内存抽象结构.png
从源代码到指令序列的重排序:
image.png在不改变程序正确执行的结果前提下,尽可能地为编译器和处理器的优化打开方便之门。
- volatile变量:
可见性:总能看到变量的最后的写入
原子性 : 对读/写具有原子性,但是 读写改就没有原子性了。
使用volatile修饰, 通过插入内存屏障,保证了程序语义的正确执行。
- Synchronized: 当线程获得锁时,JMM会将线程对应的本地内存置为无效,从而使得监视器保护的临界区必须从主内存中读取共享变量。
对比锁的释放和获取,锁的释放与volatile变量的写有相同的内存语义,锁的获取和volatile 变量的读有相同的内存语义。
本质上面就是两个线程之间的消息通信,但是通信路径加上保证,而CAS(读改写)同时具有了volatile 读和写的内存语义。这是整个concurrency包的基石:
- final 域 : 禁止将final 域的写重排序到构造函数之外。
下面是一段有问题的代码段,大家可以提出说说原因和提出解决方案: