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

这篇具有很好参考价值的文章主要介绍了并发编程的三大特性之有序性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有序性的概念

  • 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实现解决指令重排的问题是添加内存屏障。

如果您觉得我所提供的信息对您有帮助,欢迎您点赞、收藏和评论。如果您想要更深入的交流,您可以添加我的微信号,或者关注我的微信公众号。您的支持和鼓励是我持续写作的动力,我期待与您互动并提供更多有价值的信息。文章来源地址https://www.toymoban.com/news/detail-462619.html

到了这里,关于并发编程的三大特性之有序性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单例模式、指令重排序、锁、有序性

    今天在回顾单例模式时,我们都知道懒汉式单例中有一种叫做 双重检查锁的单例模式。 我们来看下下面的代码有没有问题: 这段代码我们可以看到,即优化了性能,在多线程情况下,如果实例不为空了,则直接返回了。这样就不用等待排队获取锁了。 同时也保证了线程的安

    2024年02月16日
    浏览(41)
  • 并发编程之三大特性及JMM内存模型

    目录 原子性 如何保证原子性 可见性 如何保证可见性 有序性 如何保证有序性 Java内存模型(JMM内存模型) Java内存模型的一些关键概念: 主内存与工作内存交互协议 Java内存模型通过以下手段来确保多线程程序的正确性: 锁机制 volatile volatile禁止指令重排序  Happens-Before 并发三

    2024年01月19日
    浏览(46)
  • 25、并发的三大特性

    原子性是指在一个操作中cpu不可以在中途暂停然后再调度,即不被中断操作,要不全部执行完成,要不都不执行。就好比转账,从账户A向账户B转1000元,那么必然包括2个操作: 从账户A减去1000元,往账户B加上1000元。2个操作必须全部完成。

    2024年02月16日
    浏览(36)
  • java八股文面试[多线程]——并发三大特性 原子 可见 顺序

        AutomicInteger :  volatile + CAS 总线LOCK  MESI 两个协议 TODO volatile的可见性和禁止重排序是怎么实现的: DCL场景:  new操作会在字节码层面生成两个步骤: 分配内存、调用构造器 然后把引用赋值给singleton 不加volatile则会发生指令重排,可能得到不完整的对象 知识来源: 【并

    2024年02月11日
    浏览(53)
  • Python教程(21)——面向对象编程的三大特性

    在Python中,面向对象编程是一种核心的编程思想。Python被称为“一切皆对象”的语言,因为在Python中,几乎所有的数据都被视为对象。这包括数字、字符串、列表、函数等基本类型,还有自定义的类和对象。 Python中的面向对象编程提供了类(Class)来创建对象(Object)。类是

    2024年02月03日
    浏览(53)
  • C++核心编程—类和对象,类的三大特性——封装、继承、多态

    纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 ①什么是对象? 生活中有各种各样的 事物 ,如人、动物、植物等在C++中将这些称为对象。 对象多种多样, 各种对象的属性也不相同 。 例如狗的品种,毛色,年龄等 各个对象都有自己的行为 ,例

    2024年02月07日
    浏览(64)
  • 并发性与并行性的区别和联系

    并行性个并发性是既相似又有区别的两个概念。并行性是指两个或多个事件在同一时刻发生,并发性是指两个或多个事件在同一时间间隔内发生 在多道程序环境下,并发性是指在一段时间内,宏观上有多个程序同时运行,但在单处理器系统中每个时刻却仅能有一道程序执行,

    2024年02月13日
    浏览(38)
  • Kafka经典三大问:数据有序丢失重复

    如何保证数据有序性 如何解决数据丢失问题 如何处理数据重复消费 这些不光是面试常客,更是日常使用过程中会遇到的几个问题,下面分别记录一下产生的原因以及如何解决。 1. 消息有序# kafka 的数据,在同一个partition下是默认有序的,但在多个partition中并不一定能够保证

    2024年02月10日
    浏览(32)
  • CSS_三大特性上_特性继承和层叠

    特性: 1、子元素有默认继承父元素样式的特点( 子承父业 ) 2、可以继承的常见属性(文字控制属性都可以继承) 1.color 2.font-style、font-weight、font-size、font-family 3.text-indent,text-align 4.line-height 注意点: 可以通过调试工具判断样式是否可以继承 特性: 1、给同一个标签设置不

    2024年02月08日
    浏览(50)
  • C++三大特性之一:继承

    C++三大特性:继承、多态和封装。继承是面向对象编程的一个核心概念,它允许我们根据一个已存在的类(基类或者叫父类),创建一个新的类(派生类或者叫子类),这个新的类继承了类的属性和行为。 1.继承格式。 class 子类名 :继承属性(publicprotectedprivate)父类名{

    2024年04月25日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包