有序性

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

volatile,synchronized,Lock通过volatile,synchronized,Lock保证一定的有序性,synchronized,Lock保证每一时刻只有一个线程可以执行同步代码块,相当于让线程顺序执行同步代码,从而保证有序性。另外,JVM具备一些先天的有序性,即不需要额外的手段就能保证有序性,即Happens-before原则,如果两个操作的执行次序,没有办法通过Happens-before原则推导出来,虚拟机进行随意的重排序,那么久不能保证有序性。

Happens-before

1.如果一个操作Happens-before另外一个操作,那么第一个操作的执行结果相对第二个操作可见,并且第一个操作的执行顺序在第二个操作之前执行。

2.两个操作之间存在Happens-before关系,并不意味着一定要按Happens-before原则制定的顺序执行。如果重排序之后的执行结果与Happens-before关系执行的结果一致,那么这种重排序就不非法。

下面是Happens-before的规则

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;
  • 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作;
  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;
  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;
  • 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作;
  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
  • 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过- - Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
  • 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;

Java多线程之有序性相关推荐

  1. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  2. Java多线程编程那些事:volatile解惑--转

    http://www.infoq.com/cn/articles/java-multi-thread-volatile/ 1. 前言 volatile关键字可能是Java开发人员"熟悉而又陌 ...

  3. 300 行代码带你搞懂 Java 多线程!

    线程 线程的概念,百度是这样解释的: 线程(英语:Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可 ...

  4. Java 多线程 —— 深入理解 volatile 的原理以及应用

    转载自  Java 多线程 -- 深入理解 volatile 的原理以及应用 推荐阅读:<java 多线程-线程怎么来的> 这一篇主要讲解一下volatile的原理以及应用,想必看完这一篇 ...

  5. 精选30道Java多线程面试题

    转载自 精选30道Java多线程面试题 1.线程和进程的区别 2.实现线程有哪几种方式? 3.线程有哪几种状态?它们之间如何流转的? 4.线程中的start()和run()方法有什么区别? 5.怎么终 ...

  6. 史上最全Java多线程面试题

    转载自 史上最全Java多线程面试题及答案 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域.所以,学好多线程并发编程对Java程序员来来说极其重要的. 下面小编整理了60道最常见的 ...

  7. Java多线程_1_Java内存模型_内存模型的3大特性

    Java内存模型: 内存分布情况及其关系: 主内存:Java内存模型规定所有的变量都保存在主内存中 工作内存:每个线程都有自己的工作内存,保存了该线程使用到的变量的主内存副本拷贝 主内存与工作内存的关 ...

  8. 史上最全Java多线程面试60题,含答案大赠送!

    [BAT必考系列!多线程60题] 多线程有什么用? 线程和进程的区别是什么? ava实现线程有哪几种方式? 启动线程方法start()和run()有什么区别? 怎么终止一个线程?如何优雅地终止线程? ...

  9. java复习系列[2] - Java多线程

    文章目录 JUC thread 线程状态 sleep() 与 wait() 的异同点 wait() 与 阻塞 的异同点 Some Question !!! 有了**sleep()**为什么还要有**w ...

最新文章

  1. Centos6安装Zabbix3.4
  2. FireFox IE Opera Safari 都可以正常播放WMV和MOV的网页播放器代码
  3. Struts2s:select/s:select
  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先
  5. jQuery的this $this $(this)
  6. maven系列一:pom.xml文件详解
  7. IDEA、 JetBrains、webstorm、 pycharm 破解教程
  8. Python笔记-函数装饰器
  9. 银行计算机储蓄系统程序流程图,银行储蓄系统流程图
  10. 免费python自学攻略-Python自学攻略
  11. MariaDB ColumnStore一些限制和BUG总结
  12. ueditor常见用法
  13. vue+离线百度地图
  14. Mac Chrome搜索引擎突然变成了Yahoo?!SearchToolHelper控制了我的搜索引擎
  15. 已经解决ProcfsMetricsGetter: Exception when trying to compute pagesize
  16. C# 访问ftp地址下载jpg、pdf、文件夹
  17. matlab期末数字图像处理小工具
  18. 我可爱的卧龙凤雏同事又双叒叕搞了个BUG
  19. SCT2601TVBR、LMR16006XDDCR、MP2456GJ-Z参数
  20. ATFX:中国10月CPI增速2.1,USDCNH稳定在7.2附近

热门文章

  1. [翻译]用表单字段加亮的方式为用户提供友好的界面
  2. linux舵机控制程序,Linux PWM设备驱动及舵机控制
  3. mysql for rhel7_MySQL5.7.18 for Linux7.2(二进制安装)
  4. [swift] LeetCode 96. Unique Binary Search Trees
  5. 2的指数算法唯一算包含信息
  6. 动画:一招学会TCP的三次握手和四次挥手
  7. Kubernetes首爆严重安全漏洞,请升级你的Kubernetes
  8. Ansible and FileBeta
  9. Hibernate Session和Jpa EntityManager
  10. 本页不但包含安全的内容,也包含不安全的内容