我爱编程JAVA 高级

并发编程艺术-3

2018-04-14  本文已影响0人  e86dab508bc1

本文主要简单介绍Java 内存模型的基础和相关概念,重排序和顺序一致性内存模型,同步原语 synchronized,volatile和final。

JAVA 线程之间通过java内存模型(JMM)控制


java内存抽象结构.png

从源代码到指令序列的重排序:

image.png

在不改变程序正确执行的结果前提下,尽可能地为编译器和处理器的优化打开方便之门。

  1. volatile变量:
    可见性:总能看到变量的最后的写入
    原子性 : 对读/写具有原子性,但是 读写改就没有原子性了。

使用volatile修饰, 通过插入内存屏障,保证了程序语义的正确执行。

  1. Synchronized: 当线程获得锁时,JMM会将线程对应的本地内存置为无效,从而使得监视器保护的临界区必须从主内存中读取共享变量。

对比锁的释放和获取,锁的释放与volatile变量的写有相同的内存语义,锁的获取和volatile 变量的读有相同的内存语义。

本质上面就是两个线程之间的消息通信,但是通信路径加上保证,而CAS(读改写)同时具有了volatile 读和写的内存语义。这是整个concurrency包的基石:


  1. final 域 : 禁止将final 域的写重排序到构造函数之外。

下面是一段有问题的代码段,大家可以提出说说原因和提出解决方案:

上一篇下一篇

猜你喜欢

热点阅读