首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏技术知识总结

    Java先行发生原则

    先行发生原则(Happens-Before)是Java内存模型定义一个等效判断原则。 依赖这个原则,我们可以通过几条简单规则判断数据是否存在竞争,线程是否安全,而不需要陷入Java内存模型苦涩难懂定义之中。---“先行发生原则指的是什么。 下面是Java内存模型下一些“天然先行发生关系,这些先行发生关系无须任何同步器协助就已经存在,可以在编码中直接使用。 Java 语言无须任何同步手段保障就能成立先行发生规则有且只有上面这些。---“时间上先后顺序”与“先行发生”之间有什么不同?一个操作“时间上发生”不代表这个操作会是 “先行发生”。 时间先后顺序与先行发生原则之间基本没有因果关系,所以我们衡量并发安全问题时候不要受时间顺序干扰,一切必须以先行发生原则为准。

    44630编辑于 2023-06-05
  • 来自专栏Java成长之路

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

    先行发生”(happens-before)原则。 一、什么是先行发生原则 现在就来看看“先行发生原则指的是什么。 6. ,根据程序次序规则,“int i=1”操作先行发生于“int j=2”,但是“int j=2”代码完全可能先被处理器执行,这并不影响先行发生原则正确性,因为我们在这条线程之中没有办法感知到这点。 上面两个例子综合起来证明了一个结论:时间先后顺序与先行发生原则之间基本没有太大关系,所以我们衡量并发安全问题时候不要受到时间顺序干扰,一切必须以先行发生原则为准。

    3.1K20发布于 2018-09-29
  • 来自专栏云霄雨霁

    Java虚拟机--先行发生原则

    先行发生原则先行发生是Java内存模型中定义两项操作数之间偏序关系,如果说操作A先行发生于操作B,就是说在发生操作B之前,操作A产生影响能被操作B观察到,“影响”包括修改了内存中共享变量值、发送了消息、调用了方法等 线程启动规则 :Thread对象start方法先行发生于此线程每个动作;  线程终止规则 :线程中所有操作都先行发生于对此线程终止检测;  线程中断规则 :对线程interrupt()方法调用先行发生于被中断线程代码检测到中断时间发生 ;  对象终结规则 :一个对象初始化完成先行发生于它finalize方法开始;  传递性 :如果操作A先行发生于操作B,操作B先行发生于操作C,那么,操作A也就先行发生于操作C。  依次分析一下先行发生原则各个原则:由于两个方法分别在不同线程中被调用,程序次序原则不适用;没有同步块,自然不会发生lock和unlock操作,管程锁定原则不适用;value变量没有被volatile

    61060发布于 2018-05-22
  • 来自专栏JavaEdge

    Happens-beofre 先行发生原则(JVM 规范)

    )原则 这个原则非常重要,它是判断数据是否存在竞争,线程是否安全主要依赖。 先行发生原则 指的是JMM中定义两项操作之间依序关系 happens- before关系 主要用于强调两个有冲突动作之间顺序,以及定义数据争用发生时机 如果说操作A先行发生于操作B,就是在说发生 线程中断规则(Thread Interruption Rule) 对线程interrupt()方法调用先行发生于被中断线程代码检测到中断事件发生,可以通过Thread.interrupted() A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C结论 一个操作”时间上发生“不代表这个操作会是”先行发生“,那如果一个操作”先行发生“是否就能推导出这个操作必定是”时间上发生 也是不成立,一个典型例子就是指令重排序 所以时间上先后顺序与先行发生原则之间基本没有什么关系,所以衡量并发安全问题一切必须以先行发生原则为准。

    60310发布于 2021-02-22
  • 来自专栏韩曙亮的移动开发专栏

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

    文章目录 一、指令重排序规范 二、happens-before 先行发生原则 一、指令重排序规范 ---- 指令重排指的是 , 线程中如果两行代码 没有逻辑上上下关系 , 可以对代码进行 重新排序 ; 规范 : 先行发生原则 ; 二、happens-before 先行发生原则 ---- happens-before 先行发生原则 : A happens-before B , A 先于 B 发生 , 使用 指令重排 ; happens-before 先行发生原则 适用场景 : 在以下场景中 , 不进行指令重排 , 这些先后顺序 , 绝对不能被打乱 , 否则会出现严重线程安全问题 ; 程序次序原则 检测到 中断时 事件发生 ; 必须先发生中断 , 然后才能被检测到 ; 不能还没发生中断 , 就可以检测到中断发生 ; 对象终结 : 对象创建 先于 对象终结 , 创建就是调用构造函数 , 终结就是调用 finalize 方法 ; 只要符合上述规则 , 不需要进行同步 , 就可以成立 ; 通过 " happens-before 先行发生原则 " 可以判定两个线程操作 , 是否有发生冲突可能 ;

    45410编辑于 2023-03-29
  • 来自专栏无原型不设计

    什么是“移动先行原则,如何践行?

    2010年全球移动通信大会上,谷歌时任首席执行官Eric Schmidt 提出:产品设计应遵循 “移动先行” 原则。 该原则具体指什么?遵循该原则依据有哪些?为什么它在产品设计中如此重要? 一、什么是“移动先行原则? 为了更好地理解该原则,首先要了解两个概念: 1. 响应式网页设计(RWD) 一种网页设计方法。 因为“移动先行原则,就是“逐步增强” 策略一个具体表现形式。 “移动先行”,顾名思义,即在设计多终端产品时,首先设计限制较多移动端版本,再一步步向高级终端迈进。 ? 二、为什么在产品设计中,“移动先行原则如此重要? 除了以上提到“逐步增强”设计策略可操作性更强外,“移动先行原则其实还具有强大现实基础:移动端需求爆炸式增长。 移动端需求爆炸式增长,要求设计师在进行产品设计时,重视产品移动端版本,遵从 “移动先行设计原则。 三、如何在产品设计中践行移动先行原则

    1.7K40发布于 2018-03-16
  • 来自专栏烟草的香味

    6大设计原则之开闭原则

    开闭原则好处 开闭原则是一个最基本原则,另外五个原则都是开闭原则具体形态,是指导设计工具和方法,而开闭原则才是精神领袖. 开闭原则有利于进行单元测试 开闭原则可以提高复用性 开闭原则可以提高可维护性 面向对象开发要求 开闭原则使用 1.抽象约束 通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在 不能有两个不同变化出现在同一个接口或抽象类中.封装变化,找出预计变化或不稳定点,为这些变化点创建稳定接口,准确讲是封装可能发生变化.23个设计模式都是从各个不同角度对变化进行封装. - --- 开闭原则也只是一个原则,实现拥抱变化方法很多,并不局限于这6大设计原则,但是遵循着6大设计原则基本上可以应对大多数变化. 项目规章非常重要 预知变化,在实践过程中,一旦发现有发生变化可能,或者变化曾经发生过,就需要考虑现有的架构是否可以轻松实现这一变化.

    1.4K50发布于 2019-07-25
  • 来自专栏全栈程序员必看

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

    开闭原则(OCP) 是 面向对象设计中“可复用设计”基石,是面向对象设计中最重要原则之中一个,其他非常多设计原则都是实现开闭原则一种手段。 开闭原则中“开”,是指对于组件功能扩展是开放,是同意对其进行功能扩展;开闭原则中“闭”,是指对于原有代码改动是封闭,即不应该改动原有的代码。 遵循开闭原则设计出模块具有两个主要特征: (1) 对于扩展是开放(Open for extension)。这意味着模块行为是能够扩展。 模块二进制可运行版本号,不管是可链接库、DLL或者.EXE文件,都无需修改。 实现开闭原则关键就在于“抽象”。 在20世纪90年代,开闭原则被广泛又一次定义因为抽象化接口使用,在这中间实现能够被改变,多种实现能够被创建,而且多态化替换不同实现。相比梅耶使用方式,多态开闭原则定义倡导对抽象基类继承。

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

    6大设计原则

    打算用一句话概括每一个设计原则 单一职责原则 一个类只负责一项职责,有且仅有一个原因引起类变更。 里氏替换原则 所有引用基类地方必须能透明地使用其子类对象。 只要父类能出现地方子类就可以出现。 依赖倒置原则 高层模块不应该依赖低层模块,两者都应该依赖其抽象,抽象不依赖细节,细节应该依赖抽象。 也就是面向接口编程。 接口隔离原则 类间依赖应该建立在最小接口上。 接口尽量细化,接口方法尽量少。 迪米特法则(最少知识法则) 一个对象对其他对象了解越少越好,也就是一个类应该对自己需要耦合或调用类知道得最少。 开闭原则 一个软件实体如类,模块和函数,应该对扩展开放,对修改关闭。

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

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

    接口隔离原则定义 什么是接口. 接口隔离原则实现 比如现在有一个人,他身兼数职,是一个老师,要教书,是一个学生,要学习,类图如下: ? 如果有一天,他不在教书了,或者又有了新职业,那我们还要修改调用该类代码,更好做法是将臃肿接口变更为几个独立接口 ? 接口规范约束 接口要尽量小,这是接口隔离原则核心定义,但是"小"是有限度,首先就是不能违背单一职责原则. . ---- 接口隔离原则就是对接口定义,同时也是对类定义,接口和类尽量使用原子接口或原子类来组装.

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

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

    变量和方法被修改时,需要考虑子类修改,有时更会带来非常糟糕结果--大段代码需要重构 里氏替换原则定义 如果对每一个类型为S对象o1,都有类型为T对象o2,使得以T定义所有程序P在所有的对象o1 都代换成o2时,程序P行为没有发生变化,那么类型S是类型T子类型. 里氏替换原则规范(继承规范) 1.子类必须完全实现父类方法 例如有一个打枪游戏,类图如下 ? 其 Soldier 代码如下 ? ,将声音、形状都委托给 AbstractGun 处理,然后两个基类下子类自由延展,互不影响 注意: 如果子类不能完整实现弗雷方法,或者弗雷某些方法在子类中已经发生"畸变",则建议断开父子继承关系 ,而子类返回Map类型就违背了里氏替换原则 采用里氏替换原则好处 增强程序健壮性,版本升级是也可以保持非常好兼容性.即使增加子类,原有的子类还可以继续运行.在实际项目中,每个子类对应不同业务含义

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

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

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

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

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

    单一职责原则 如果有一个用户管理类,类图如下 ? 我想,任谁也能看出这个接口设计有问题,用户属性和用户行为没有分开,应该把用户信息抽取成一个业务对象,把用户行为抽取成一个业务对象,按照这个思路对类图进行修正,如下图所示 ? 其实,在实际使用中我们更倾向于使用两个不同接口: 一个IUserBO,一个IUserBiz 单一职责原则定义 应该有且仅有一个原因引起类变更 单一职责原则好处: 类复杂性降低,实现什么职责都有清晰明确定义 可读性提高,复杂性降低了,可读性当然就提高了 可维护性提高,可读性提高了,当然更容易维护了 变更引起风险降低.变更是必不可少,如果接口单一职责做好,一个接口修改只对相应实现类有影响,对其他类无影响 ,这对系统扩展性、维护性都有非常大帮助 ---- 单一职责原则适用于接口、类,同样也适用于方法. ---- 单一职责原则是非常优秀,但是在实际使用中受很多因素制约 建议,接口一定要做到单一职责,

    43830发布于 2019-07-25
  • 来自专栏代码世界

    6大设计原则总结

    6大设计原则总结 一、单一职责原则  单一职责原则:英文名称是Single Responsiblity Principle,简称是SRP。定义:应该有且仅有一个原因引起类变更。 (如果对每一个类型为S对象o1,都有类型为T对象o2,使得以T定义所有程序P在所有的对象o1都代换成o2时,程序P行为没有发生变化,那么类型S是类型T子类型。) 如果子类不能完整地实现父类方法,或者父类某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。 依赖倒置原则在Java语言中表现就是: 模块间依赖通过抽象发生,实现类之间不发生直接依赖关系,其依赖关系是通过接口或抽象类产生; 接口或抽象类不依赖于实现类; 实现类依赖接口或抽象类。    一个展示数据列表,按照原有的需求是6列,突然有一天要增加1列,而且这一列要跨N张表,处理M个逻辑才能展现出来,这样变化是比较恐怖,但还是可以通过扩展来完成变化,这就要看我们原有的设计是否灵活。

    97290发布于 2018-04-12
  • 来自专栏国产程序员

    面向对象7种设计原则(6)-迪米特原则

    迪米特原则 迪米特原则(Law of Demeter)又叫最少知道原则(Least Knowledge Principle),可以简单说成:talk only to your immediate friends 模式与意义 迪米特法则,如果两个类不必彼此直接通向,那么这两个类就不应当发生直接相互作用。如果其中一个类需要调用另一个累哦某一个方法的话,可以通过第三者转发这个调用。 面向对象设计原则和面向对象三大特性本就不是矛盾。迪米特法则其根本思想,是强调了类之间松耦合。 类之间耦合越弱,越有利于复用,一个处在弱耦合类被修改,不会对有关系类造成搏击,也就是说,信息隐藏促进了软件复用。 优点 减少对象之间耦合性 ? 摘自大话设计模式: ? ? ? 注意 在类划分上,应该创建弱耦合类。类与类之间耦合越弱,就越有利于实现可复用目标。 在类结构设计上,尽量降低类成员访问权限。 在类设计上,优先考虑将一个类设置成不变类。

    70540发布于 2020-08-17
  • 来自专栏DevOps持续集成

    DevOps推动业务成功6原则

    当正式投入生产且Dev在进行代码工作时,Ops应该在那里以确保期望结果并解决在通用框架下出现任何工作流故障。 ? 但是,除了他们协作和努力有效性之外,这是开发量身定制应用程序目标。 1协作 开发和运营团队在各自小隔间里为公司共同利益编写应用程序已经不是一天了。这种智能过程具有超越开发公司范围能力。它涵盖了参与应用程序开发,质量保证和接收组织每个人。 2自动化 DevOps高度依赖于工具自动化。不是一个,两个或三个而是一个完整工具链,不仅可以实现自动化,而且可以将不同团队和参与此过程其他人员联系起来。 6持续监控 没有办法确保逐步DevOps流程,它本质是要求跨开发框架各个要素相互对话。那么如何处理失败呢?您找到它们并立即对其进行修复,这就是持续监视目的。 原文链接: https://www.veritis.com/blog/devops-capabilities-a-6-point-principle-that-drives-business-success

    43320发布于 2021-04-22
  • 来自专栏sylan215 的软件测试技术学习

    优先进行测试 6原则

    有一次洗完之后,我看到蓬蓬乱乱,就想着给梳顺了再吹,谁知道这梳子一下去怎么也梳不动,稍微使劲又拽着头发痛,我就犯嘀咕了,这不是刚洗完头发应该丝滑般顺柔么? 要么接受现在方案,毕竟进度已经推进差不多了,要么推翻现在方案,毕竟目前结果并不是用户需要。 如果是有如果的话,优先确认需求合理性是不是能发现这个问题? 这个例子稍微有点极端,因为过程中漏洞太多了,但是不排除实际没有这样事情发生。 为了更准确说明,我就再讲个故事好了。 我大概总结了这么几条原则,仅供参考: 1、优先完成用户实际场景测试,其他再按需各种测; 2、优先保证需求合理性,再验证实现正确性; 3、优先验证实现方案合理性,再验证实现正确性; 4、优先测试容易出现问题地方 看之前反馈和问题单),再做常规测试; 5、优先功能验证,再做 UI 验证; 6、尽早联调、尽早联调、尽早联调; 以上,我通过三个小故事说明了优先级在做事(测试)过程中重要性,同时提供了几个优先测试原则

    50440发布于 2020-03-13
  • 来自专栏全栈程序员必看

    Python6大设计原则

    (如果对每一个类型为S对象o1,都有类型为T对象o2,使得以T定义所有程序P在所有的对象o1都代换成o2时,程序P行为没有发生变化,那么类型S是类型T子类型。) ; 如果子类不能完整地实现父类方法,或者父类某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。 依赖倒置原则在Java语言中表现就是: 模块间依赖通过抽象发生,实现类之间不发生直接依赖关系,其依赖关系是通过接口或抽象类产生; 接口或抽象类不依赖于实现类; 实现类依赖接口或抽象类。    一个软件产品只要在生命周期内,都会发生变化,既然变化是一个既定事实,我们就应该在设计时尽量适应这些变化,以提高项目的稳定性和灵活性,真正实现“拥抱变化”。 一个展示数据列表,按照原有的需求是6列,突然有一天要增加1列,而且这一列要跨N张表,处理M个逻辑才能展现出来,这样变化是比较恐怖,但还是可以通过扩展来完成变化,这就要看我们原有的设计是否灵活。

    55730编辑于 2022-07-21
  • 来自专栏小樱的经验随笔

    设计模式六大原则6):开闭原则

    也就是说,只要我们对前面5项原则遵守好了,设计出软件自然是符合开闭原则,这个开闭原则更像是前面五项原则遵守程度“平均得分”,前面5项原则遵守好,平均分自然就高,说明软件设计开闭原则遵守好;如果前面 5项原则遵守不好,则说明开闭原则遵守不好。          而软件中易变细节,我们用从抽象派生实现类来进行扩展,当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了。 在上图中,设计1、设计2属于良好设计,他们对六项原则遵守程度都在合理范围内;设计3、设计4设计虽然有些不足,但也基本可以接受;设计5则严重不足,对各项原则都没有很好遵守;而设计6则遵守过渡了,设计 5和设计6都是迫切需要重构设计。         

    1.1K70发布于 2018-04-08
  • 来自专栏小鑫同学编程历险记

    【程序设计】6大设计原则之接口隔离原则

    这样接口定义是不利于扩展,也将对后期维护带来困扰,我们将通过示例来演示符合接口隔离原则带来好处。 概念: 接口隔离原则定义: 客户端不应该被迫依赖于它不适用方法 接口隔离原则要求: 将臃肿庞大接口拆分成更小和更加具体接口,保证客户端只得到自己需要方法 案例: 需求: 设计HomePage 功能支持点击事件:可以跳转到EditPage页面 功能支持双击事件:可以双击后退出程序 设计EditPage页面 功能支持双击事件:可以双击后选择文本 功能支持长按事件:可以长按后选择全部文本 违反原则实现 符合原则实现: 将要原来接口进行细粒度拆分: 拆分后接口可以由需要页面有选择进行自由组合来实现 interface OnClickListener { onClick(): void; } 按照合理设计进行符合接口隔离原则拆分对实现代码高内聚,低耦合将变得尤为重要。

    41420编辑于 2022-12-26
领券