首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏吉林乌拉

    happens-before原则

    在Java中有一个很重要的原则,这个原则是判断线程是否存在数据竞争、线程是否安全的主要依据,这个原则就是happens-before原则。我们首先看一下到底什么是happens-before原则。 简单来说happens-before原则就是JMM中定义的两项操作之间的偏向关系。假如我们有两个操作A和B。 上述就是happens-before原则的定义,下面我们用一个简单的例子来说明一下happens-before原则到底有什么作用。 ? 在JMM中直接就具有happens-before原则,我们不需要进行任何同步,可以直接在编码中使用它们。 如果代码中的操作没有happens-before原则的话,那么虚拟机在执行的时候,就有可能对它们进行随意的重排序。下面我们看一下在JMM中都有哪些操作是默认具有happens-before原则的。

    61130发布于 2019-08-14
  • 来自专栏多线程

    什么是happens-before原则

    线程内的happens-before 在同一个线程中,字节码的先后顺序(program order)也暗含了 happens-before 关系:在程序控制流路径中靠前的字节码 happens-before 线程间的 happens-before 解锁操作 happens-before 之后(这里指时钟顺序先后)对同一把锁的加锁操作。 线程的启动操作(即 Thread.starts()) happens-before 该线程的第一个操作。 构造器中的最后一个操作 happens-before 析构器的第一个操作。 happens-before关系的传递性 如果操作 X happens-before 操作 Y,而操作 Y happens-before 操作 Z,那么操作 X happens-before 操作 Z。

    34730编辑于 2023-10-16
  • 来自专栏Java成长之路

    先行发生原则(happens-before)介绍

    内存模型中所有的有序性都仅仅靠volatile和synchronized来完成,那么有一些操作将会变得很烦琐,但是我们在编写Java并发代码的时候并没有感觉到这一点,这是因为Java语言中有一个“先行发生”(happens-before )的原则。 这个原则非常重要,它是判断数据是否存在竞争、 线程是否安全的主要依据,依靠这个原则,我们可以通过几条规则一揽子地解决并发环境下两个操作之间是否可能存在冲突的所有问题。 一、什么是先行发生原则 现在就来看看“先行发生”原则指的是什么。 6.

    3.2K20发布于 2018-09-29
  • 来自专栏冰河技术

    何为Happens-Before原则?这次彻底懂了!

    在正式介绍Happens-Before原则之前,我们先来看一段代码。 其实,答案就是在JDK1.5版本中的Java内存模型中引入了Happens-Before原则。 接下来,我们就结合案例程序来说明Java内存模型中的Happens-Before原则。 【原则三】传递规则 如果A Happens-Before B,并且B Happens-Before C,则A Happens-Before C。 我们结合【原则一】、【原则二】和【原则三】再来看【示例一】程序,此时,我们可以得出如下结论: (1)x = 42 Happens-Before 写变量v = true,符合【原则一】程序次序规则。 【原则四】锁定规则 对一个锁的解锁操作 Happens-Before于后续对这个锁的加锁操作。

    6.8K82发布于 2020-10-29
  • 来自专栏盛开在夏天的太阳

    2.2 指令重排&happens-before 原则 & 内存屏障

    1.2. happens-before 原则 只靠sychronized和volatile关键字来保证原子性、可见性以及有序性,那么编写并发 程序可能会显得十分麻烦,幸运的是,从JDK 5开始,Java 使用新的JSR-133内存模型,提 供了happens-before 原则来辅助保证程序执行的原子性、可见性以及有序性的问题,它是 判断数据是否存在竞争、线程是否安全的依据,happens-before 原则内容如下 1. 程序顺序原则   即在一个线程内必须保证语义串行性,也就是说按照代码顺序执行。 2. 传递性   A先于B ,B先于C 那么A必然先于C 6. 线程终止规则   线程的所有操作先于线程的终结,Thread.join()方法的作用是等待 当前执行的线程终止。

    2.4K20发布于 2020-09-27
  • 来自专栏飞天小牛肉

    JMM 最最最核心的概念:Happens-before 原则

    我想,这两句话就已经足够表明 Happens-before 原则的重要性。 那为什么 Happens-before 被不约而同的称为 JMM 的核心和灵魂呢? 生来如此。 原则,一个 Happens-before 规则就对应于一个或多个编译器和处理器的重排序规则,这样,我们只需要弄明白 Happens-before 就行了。 6)线程中断规则(Thread Interruption Rule):对线程 interrupt() 方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过 Thread 对象的 interrupted 既然不满足 Happens-before 原则,那我修改下让它满足不就行了。 原则为准。

    1K40发布于 2021-05-14
  • 来自专栏烟草的香味

    6大设计原则之开闭原则

    开闭原则的定义 开闭原则的定义: 一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭.即一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则的好处 开闭原则是一个最基本的原则,另外五个原则都是开闭原则的具体形态,是指导设计的工具和方法,而开闭原则才是精神领袖. 开闭原则有利于进行单元测试 开闭原则可以提高复用性 开闭原则可以提高可维护性 面向对象开发的要求 开闭原则的使用 1.抽象约束 通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的 不能有两个不同的变化出现在同一个接口或抽象类中.封装变化,找出预计的变化或不稳定的点,为这些变化点创建稳定的接口,准确的讲是封装可能发生的变化.23个设计模式都是从各个不同的角度对变化进行封装的. ---- 开闭原则也只是一个原则 ,实现拥抱变化的方法很多,并不局限于这6大设计原则,但是遵循着6大设计原则基本上可以应对大多数变化.

    1.4K50发布于 2019-07-25
  • 来自专栏韩曙亮的移动开发专栏

    【Java 并发编程】指令重排序规范 ( happens-before 先行发生原则 )

    文章目录 一、指令重排序规范 二、happens-before 先行发生原则 一、指令重排序规范 ---- 指令重排指的是 , 线程中如果两行代码 没有逻辑上的上下关系 , 可以对代码进行 重新排序 ; 规范 : 先行发生原则 ; 二、happens-before 先行发生原则 ---- happens-before 先行发生原则 : A happens-before B , A 先于 B 发生 , 先行发生原则 适用场景 : 在以下场景中 , 不进行指令重排 , 这些先后顺序 , 绝对不能被打乱 , 否则会出现严重线程安全问题 ; 程序次序原则 : 在程序内 , 按照代码书写的执行顺序 , 前面的代码先执行 规则具有传递性 ; 如果 A happens-before B 和 B happens-before C , 则 A happens-before C ; 线程中断 : 调用线程 interrupt( 先行发生原则 " 可以判定两个线程的操作 , 是否有发生冲突的可能 ;

    45710编辑于 2023-03-29
  • 来自专栏技术分享

    深入理解Happens-Before原则:以实例解析并发编程的基石

    Happens-Before原则概述Happens-Before原则是Java内存模型(JMM)中定义的一种偏序关系,用于确定两个操作之间的相对顺序。 Happens-Before原则的实例解析单一线程内的操作在一个线程内,按照程序顺序执行的操作自然满足Happens-Before原则。这是因为单个线程内的操作是顺序执行的,没有并发访问的问题。 这里,锁的释放操作happens-before锁的获取操作。 Happens-Before原则小结Happens-Before原则是并发编程中的基石,它定义了线程间操作顺序和可见性的保证。我们理解并遵循这一原则,就可以编写出正确且可预测的并发程序。 本篇文章到此结束,希望我们开发者们在编写代码时都牢记住这一原则哦!

    72220编辑于 2024-08-09
  • 来自专栏全栈程序员必看

    设计模式之6原则(6)开闭原则

    开闭原则(OCP) 是 面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之中的一个,其他非常多的设计原则都是实现开闭原则的一种手段。 开闭原则中“开”,是指对于组件功能的扩展是开放的,是同意对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的改动是封闭的,即不应该改动原有的代码。 实现开闭原则的关键就在于“抽象”。把系统的全部可能的行为抽象成一个抽象底层,这个抽象底层规定出全部的详细实现必须提供的方法的特征。 这就要求我们在设计的时候,要很清楚地了解用户需求,推断需求中包括的可能的变化,从而明白在什么情况下使用开闭原则。 在20世纪90年代,开闭原则被广泛的又一次定义因为抽象化接口的使用,在这中间实现能够被改变,多种实现能够被创建,而且多态化的替换不同的实现。相比梅耶的使用方式,多态开闭原则的定义倡导对抽象基类的继承。

    61821编辑于 2022-07-09
  • 来自专栏互联网大杂烩

    6大设计原则

    打算用一句话概括每一个设计原则 单一职责原则 一个类只负责一项职责,有且仅有一个原因引起类的变更。 里氏替换原则 所有引用基类的地方必须能透明地使用其子类对象。 依赖倒置原则 高层模块不应该依赖低层模块,两者都应该依赖其抽象,抽象不依赖细节,细节应该依赖抽象。 也就是面向接口编程。 接口隔离原则 类间依赖应该建立在最小接口上。 开闭原则 一个软件实体如类,模块和函数,应该对扩展开放,对修改关闭。

    40230发布于 2018-08-22
  • 来自专栏烟草的香味

    6大设计原则之接口隔离原则

    接口隔离原则的定义 什么是接口. 接口隔离原则的实现 比如现在有一个人,他身兼数职,是一个老师,要教书,是一个学生,要学习,类图如下: ? 接口的规范约束 接口要尽量小,这是接口隔离原则的核心定义,但是"小"是有限度的,首先就是不能违背单一职责原则. . ---- 接口隔离原则就是对接口的定义,同时也是对类的定义,接口和类尽量使用原子接口或原子类来组装.

    87810发布于 2019-07-25
  • 来自专栏烟草的香味

    6大设计原则之里氏替换原则

    降低代码的灵活性.子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束 增强了耦合性.当父类的常量、变量和方法被修改时,需要考虑子类的修改,有时更会带来非常糟糕的结果--大段代码需要重构 里氏替换原则的定义 里氏替换原则的规范(继承的规范) 1.子类必须完全实现父类的方法 例如有一个打枪的游戏,类图如下 ? 其 Soldier 代码如下 ? 而是重载,因为输入参数不同 父类的参数范围小,当调用子类 doSomething方法时,若参数为HashMap调用父类方法,若为Map调用子类方法 要是反过来,子类的 参数比父类范围下,就违背了里氏替换原则 4.覆写或实现父类的方法是输出结果可以被缩小 这个也不难理解,也就是说父类方法返回的是Map时,子类可以返回HashMap 但是反过来,父类返回的是HashMap,而子类返回Map类型就违背了里氏替换原则 采用里氏替换原则的好处 增强程序的健壮性,版本升级是也可以保持非常好的兼容性.即使增加子类,原有的子类还可以继续运行.在实际项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑

    81320发布于 2019-07-25
  • 来自专栏烟草的香味

    6大设计原则之依赖倒置原则

    依赖倒置原则的定义 依赖倒置原则的原始定义如下: High level modules should not depend upon low level modules. 依赖倒置原则在Java语言中表现为: 模块间的依赖通过抽象产生,实现类之间不发生直接依赖,其依赖关系是通过接口或抽象类产生的 接口或抽象类不依赖于实现类 实现类依赖接口或抽象类 依赖倒置原则的好处 采用依赖倒置原则可以减少类间的耦合性 任何类都不应该从具体类派生 尽量不要覆写基类的方法 结合里氏替换原则(父类出现的地方,子类就可以出现),例如,接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现 ,实现类精确的实现业务逻辑同时在适当的时候对父类进行细化 ---- 依赖倒置原则6个设计原则中最难以实现的原则,他是实现开闭原则的重要途经,依赖倒置原则没有实现,就别想实现对扩展开放,对修改关闭.在项目中 ,只要记住是"面向接口编程"就基本抓住了依赖倒置原则的核心

    70030发布于 2019-07-25
  • 来自专栏做不甩锅的后端

    多线程基础(四):volatile和可见性问题及happens-before原则

    local is [5] Update value [6] to [6] Get change for INIT [7] local is [6] Update value [7] to [7] Get Get change for INIT [6] local is [5] Update value [6] to [7] Get change for INIT [7] local is [6] Update 4.Happens-Before规则 在《深入理解Java虚拟机》一书中,对Happens-Before原则进行了归纳,主要是以下8个: 1.程序次序规则:在同一线程内部,按照代码顺序,关联代码书写在前面的操作优先发生于书写在后面的操作 如何来理解这些Happens-Before规则呢?Happens-Before并不是说,前一个操作发生在后续操作的前面。而是要表达,前面一个操作的结果对后续操作是可见的。 实际上,Happens-Before对编译器的行为进行了约束,编译器可以根据需要多代码的执行顺序进行优化,但是,编译器的这种优化一定要遵守Happens-Before规则。

    75720发布于 2020-09-08
  • 来自专栏代码世界

    6大设计原则总结

    6大设计原则总结 一、单一职责原则  单一职责原则:英文名称是Single Responsiblity Principle,简称是SRP。定义:应该有且仅有一个原因引起类的变更。 那才是完全解耦,在实际的项目中,需要适度地考虑这个原则,别为了套用原则而做项目。 原则只是供参考,如果违背了这个原则,项目也未必会失败,这就需要大家在采用原则时反复度量,不遵循是不对的,严格执行就是“过犹不及”。 一个展示数据的列表,按照原有的需求是6列,突然有一天要增加1列,而且这一列要跨N张表,处理M个逻辑才能展现出来,这样的变化是比较恐怖的,但还是可以通过扩展来完成变化,这就要看我们原有的设计是否灵活。 其次,开闭原则是最基础的一个原则,前面介绍的原则都是开闭原则的具体形态,也就是说前五个原则就是指导设计的工具和方法,而开闭原则才是其精神领袖。

    98190发布于 2018-04-12
  • 来自专栏烟草的香味

    6大设计原则之单一职责原则

    单一职责原则 如果有一个用户管理类,类图如下 ? 其实,在实际使用中我们更倾向于使用两个不同的接口: 一个IUserBO,一个IUserBiz 单一职责原则定义 应该有且仅有一个原因引起类的变更 单一职责原则的好处: 类的复杂性降低,实现什么职责都有清晰明确的定义 可读性提高了,当然更容易维护了 变更引起的风险降低.变更是必不可少的,如果接口的单一职责做的好,一个接口修改只对相应的实现类有影响,对其他类无影响,这对系统的扩展性、维护性都有非常大的帮助 ---- 单一职责原则适用于接口 、类,同样也适用于方法. ---- 单一职责原则是非常优秀的,但是在实际使用中受很多因素的制约 建议,接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化

    44430发布于 2019-07-25
  • 来自专栏TopCoder

    happens-before那些事儿

    happens-before原则定义如下: 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。 两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。 传递规则:体现了happens-before原则具有传递性,即A happens-before B , B happens-before C,那么A happens-before C。 说了这么多happends before原则,那么它是如何实现的呢? 比如volatile规则是volatile产生内存屏障保证了读在写之后进行的。 happen-before原则是JMM中非常重要的原则,它是判断数据是否存在竞争、线程是否安全的主要依据,保证了多线程环境下的可见性。

    62510发布于 2020-11-05
  • 来自专栏陈树义

    什么是 happens-before

    为了能帮助编程人员理解,于是就有了与其相等价的判断原则 —— 先行发生原则,它可以用于判断一个访问在并发环境下是否安全。 到这里,我们需要明白:happens-before 原则是对 Java 内存模型的简化,让我们更好地写出并发代码。 什么是 happens-beforehappens-before 指的是 Java 内存模型中两项操作的顺序关系。 总结 happens-before 原则一共有 8 条原则,它是对 Java 内存模型规则的简化,帮助编程人员提高编程效率。 时间先后顺序与先行发生原则之间基本没有太大的关系,我们衡量并发安全问题的时候不要受到时间顺序的干扰,一切必须以先行发生原则为准。

    65910编辑于 2022-06-28
  • 来自专栏全栈程序员必看

    Python6大设计原则

    内容总览 六大设计原则都有哪些 一、单一职责原则 二、里氏替换原则 三、依赖倒置原则 四、接口隔离原则 五、迪米特法则 六、开放封闭原则 内容详解 一、单一职责原则 单一职责原则:英文名称是Single 那才是完全解耦,在实际的项目中,需要适度地考虑这个原则,别为了套用原则而做项目。 原则只是供参考,如果违背了这个原则,项目也未必会失败,这就需要大家在采用原则时反复度量,不遵循是不对的,严格执行就是“过犹不及”。 一个展示数据的列表,按照原有的需求是6列,突然有一天要增加1列,而且这一列要跨N张表,处理M个逻辑才能展现出来,这样的变化是比较恐怖的,但还是可以通过扩展来完成变化,这就要看我们原有的设计是否灵活。 其次,开闭原则是最基础的一个原则,前面介绍的原则都是开闭原则的具体形态,也就是说前五个原则就是指导设计的工具和方法,而开闭原则才是其精神领袖。

    56430编辑于 2022-07-21
领券