Java并发编程的艺术 7.2分
读书笔记 第三章 Java内存模型
元勰

1、Java内存模型的定义

Java内存模型的定义是通过动作的形式描述的。所谓动作包括变量的读和写、监视器加锁和释放锁、线程的启动和拼接(join)。并且由这些关系所规定的出来的happens-before原则。简单来说就是一个动作的结果需要对另一个动作可见,而不管这些动作在不在一个线程中。本质上来说就是一个线程通过happens-before原则向另一个线程发送消息。

2、happens-before 原则的内容

happens-before原则包括以下内容:

  1. 程序次序法则:线程中的每个动作A都happens-before于该线程中的每一个动作B,其中,在程序中,所有动作B都出现在动作A之后。
  2. 监视器法则:对一个监视器锁的解锁happens-before于每一个后续对同一监视器的加锁
  3. volatile变量法则:对volatile域的写入操作happens-before与每一个后续对该域的读操作。
  4. 线程启动法则:在一个线程中,对于Thread.start的调用会happens-before每一个启动线程中的动作。
  5. 线程终结法则:线程中的任何动作都happens-before与其他线程检测到这个线程已经终结、或者从Thread.join调用中成功返回,或者Thread.isAlive返回false
  6. 中断法则:一个线程调用另一个线程的interrupt happens-before于被中断线程发现中断(对中断的响应)。
  7. 终结法则:一个对象的构造函数结束于这个对象的finalizer的开始
  8. 传递性:如果A happens-before于B,且B happens-before于C,则A happens-before于C

由类库保证的其他happens-before原则有

  1. 将一个条目置于线程安全容器happens-before于另一个线程从容器中获取条目。
  2. 执行CountDownLatch的倒计时happens-before于线程从闭锁的await中返回。
  3. 释放一个许可Semaphore happens-before于从同一Semaphore里获取一个许可。
  4. Futrue表现的任务所发生的动作happens-before于,另一个线程成功的从Future.get中返回
  5. 向Executer提交一个Runable或者Callable happens-before于开始执行任务
  6. 一个线程到达CyclicBarrier或者Exchanger happens-before于相同关卡(barrier)或者exchange点钟的其他线程被释放。如果CyclicBarrier使用一个关卡动作,到达关卡happens-before与关卡动作,依照次序,关卡动作happens-before于线程从关卡中释放。

3、 happens-before原则是实现

jvm主要是通过插入特定的内存屏障来禁止指令重排,实现happens-before原则的。这里面就包括对原子变量的读写,对volatile变量的读写和对final变量的读写来完成的。

0
《Java并发编程的艺术》的全部笔记 4篇
豆瓣
免费下载 iOS / Android 版客户端