并发编程的三大特性之有序性

简介: 并发编程的三大特性之有序性

有序性的概念

  • Java文件在被cpu执行前会进行编译成cpu可以执行的指令,为了提高cpu的执行效率会对其中的一些语句进行重排序。
  • Java指令最终是乱序执行的目的是为了提高cpu的执行效率,发挥cpu的性能


单例模式由于指令重排可能会出现上述的问题,原因就在于当你new出一个对象的时候,jvm将这个步骤分为了三个部分。开辟空间,初始化,指针指向开辟空间的地址。所以当出现指令重排的时候,只需要上述的最后两个步骤发生调换就会出现问题,导致空指针异常。


as-if-serial

as-if-serial语义:

不论指定如何重排序,需要保证单线程的程序执行结果是不变的。

而且如果存在依赖的关系,那么也不可以做指令重排。


happens-before

具体规则:

1. 单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。

  2. 锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock操作

3. volatile的happen-before原则: 对一个volatile变量的写操作happen-before对此变量的任意操作。

 4. happen-before的传递性原则: 如果A操作 happen-before B操作,B操作happen-before C操作,那么A操作happen-before C操作。

 5. 线程启动的happen-before原则:同一个线程的start方法happen-before此线程的其它方法。

 6. 线程中断的happen-before原则:对线程interrupt方法的调用happen-before被中断线程的检测到中断发送的代码。

 7. 线程终结的happen-before原则:线程中的所有操作都happen-before线程的终止检测。

 8. 对象创建的happen-before原则:一个对象的初始化完成先于他的finalize方法调用。


JMM只有在不出现上述8中情况时,才不会触发指令重排效果。

不需要过分的关注happens-before原则,只需要可以写出线程安全的代码就可以。

volatile

volatile实现解决指令重排的问题是添加内存屏障。


如果您觉得我所提供的信息对您有帮助,欢迎您点赞、收藏和评论。如果您想要更深入的交流,您可以添加我的微信号,或者关注我的微信公众号。您的支持和鼓励是我持续写作的动力,我期待与您互动并提供更多有价值的信息。

目录
相关文章
|
6天前
|
缓存
并发编程的三大特性之可见性
并发编程的三大特性之可见性
12 0
|
8月前
|
Java 编译器 开发者
【并发编程的艺术】Java内存模型的顺序一致性
首先明确一点,顺序一致性内存模型是一个被理想化了的理论参考模型,提供了很强的内存可见性保证。其两大特性如下: 1)一个线程中的所有操作,必须按照程序的顺序来执行(代码编写顺序) 2)无论程序是否同步,所有线程都只能看到一个单一的操作执行顺序。每个操作都必须原子执行且立即对所有线程可见。
132 0
|
6天前
|
缓存 安全 Java
多线程的三大特性:原子性、可见性和有序性
多线程的三大特性:原子性、可见性和有序性
24 0
|
6天前
|
Java
并发编程的三大特性之原子性
并发编程的三大特性之原子性
13 0
|
6天前
|
设计模式 并行计算 安全
【C/C++ 多线程编程】深入探讨双检锁与原子操作
【C/C++ 多线程编程】深入探讨双检锁与原子操作
42 0
|
10月前
|
存储 缓存 SpringCloudAlibaba
JUC并发编程(一):Java内存模型(JMM)及三大特性:可见性、有序性、原子性
在当今高流量、高并发的互联网业务场景下,**并发编程技术**显得尤为重要,不管是哪一门编程语言,掌握并发编程技术是个人进阶的必经之路。时隔一个半月没有写技术博客文章,有点生疏了。。。闲话少叙,接下来我将围绕并发编程知识点进行总结讲解,这里从并发编程入门开始,讲述Java内存模型和并发的三大特性。
122 1
JUC并发编程(一):Java内存模型(JMM)及三大特性:可见性、有序性、原子性
|
9月前
|
安全 Java 数据库
【并发编程特性】并发编程特性之五种特性的探讨
【并发编程特性】并发编程特性之五种特性的探讨
66 0
|
10月前
|
缓存 安全 Java
Java并发编程三大特性
导致并发程序出现问题的根本原因
78 0
|
缓存 Java 编译器
并发编程(三)原子性&可见性&有序性
并发编程(三)原子性&可见性&有序性
103 0
|
缓存 Java 编译器
Java并发编程(实战):如何解决可见性和有序性问题
Java 内存模型这个概念,在职场的很多面试中都会考核到,是一个热门的考点,也是一个人并发水平的具体体现。原因是当并发程序出问题时,需要一行一行地检查代码,这个时候,只有掌握 Java 内存模型,才能慧眼如炬地发现问题。 什么是 Java 内存模型? 你已经知道,导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了。