并发编程-07线程安全性之有序性

版权声明:【show me the code ,change the world】 https://blog.csdn.net/yangshangwei/article/details/87569245

脑图

在这里插入图片描述


概述

java内存模型中允许编译器和处理器对指令进行重排序,但是重排序的过程不会影响单线程程序的执行,却会影响多线程并发执行的正确性

JMM为了保证有序性,可以通过 volatile、synchronized、Lock 。

synchronized、Lock通过保证同一时刻只能有一个线程操作,从而保证了有序性.


happens-before (先行发生)原则

Java 内存模型具备一些先天的“有序性”,即不需要通过任何手段就能够得到保证的有序性,这个通常也称为 happens-before 原则。

如果两个操作的执行次序无法从 happens-before 原则推导出来,那么它们就不能保证它们的有序性,虚拟机可以随意地对它们进行重排序。

《深入理解Java虚拟机》中的 appens-before 的8条原则

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作

  • 锁定规则:一个 unLock 操作先行发生于后面对同一个锁的 lock 操作

  • volatile 变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作

  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C

  • 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作

  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生

  • 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行

  • 对象终结规则:一个对象的初始化完成先行发生于他的 finalize() 方法的开始


线程安全性 小结

经过几篇文章的学习,我们系统梳理了线程安全性的3个体现的具体实现

并发编程-03线程安全性之原子性(Atomic包)及原理分析

并发编程-04线程安全性之原子性Atomic包的4种类型详解

并发编程-05线程安全性之原子性【锁之synchronized】

并发编程-06线程安全性之可见性 (synchronized + volatile)

并发编程-07线程安全性之有序性

  • 原子性

    Atomic包 + CAS算法、synchronized、Lock(后续重点介绍)

  • 可见性

    synchronized、volatile

  • 有序性
    happen-before原则


代码

https://github.com/yangshangwei/ConcurrencyMaster

猜你喜欢

转载自blog.csdn.net/yangshangwei/article/details/87569245