前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java多线程之有序性

Java多线程之有序性

原创
作者头像
开源日记
修改2021-01-20 10:35:40
5350
修改2021-01-20 10:35:40
举报
文章被收录于专栏:JVMGCJVMGC

有序性

在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()方法的开始;
wx.jpg
wx.jpg

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 有序性
  • Happens-before
    • 下面是Happens-before的规则
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档