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

    Java先行发生原则

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

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

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

    先行发生”(happens-before)原则。 一、什么是先行发生原则 现在就来看看“先行发生原则指的是什么。 “j=i”,那么可以确定在线程B操作执行后,变量j值一定等于1,得出这个结论依据有两个:一是根据先行发生原则,“i=1”结果可以被观察到;二是线程C还没“登场”,线程A操作结束之后没有其他线程会修改变量 ,根据程序次序规则,“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
  • 来自专栏编程一生

    系统架构11原则

    基本原则 原则一:价值为王 解析: 价值为王另一种说法叫做YAGNI。YAGNI 是 You aren’t gonna need it 缩写。该原则基本含义就是,不应该开发任何当前不使用功能。 原则四:服务自治 解析: 在系统设计时,要考虑服务上线后,对于问题要自感知、自修复、自优化、自运维及自安全。 原则五:拥抱变化 解析: 重视架构扩展性和可运维性。无状态系统是可扩展和直接。 如果不能降低人力成本,反而需要更多的人,那么这个架构设计一定是失败。 稳定性原则 原则八:依赖最简 解释: 依赖原则是去除依赖、弱化依赖、控制依赖。多一个依赖多一分风险。 原则九:不作不死 解释: 尽可能做较少功能。当有疑问时候,就不要去做,甚至干掉。很多功能从来不会被使用。最多留个扩展点就够了。 如果一件事情有可能发生则在生产环境中一定会发生,架构中要做好容错设计。 原则十一:用成熟技术 解析: 不要给别人技术当小白鼠,不要因技术本身问题影响系统稳定。

    69420编辑于 2022-05-06
  • 来自专栏JavaEdge

    Java内存模型与volatile关键字Java内存模型(JMM)指令重排序对于Long和double型变量特殊规则内存屏障有序性(Ordering)先行发生原则

    先行发生原则 如果JMM中所有的有序性都只靠volatile和synchronized,那么有一些操作将会变得很繁琐,但我们在编写Java并发代码时并没有感到这一点,这是因为Java语言中有一个先行发生 先行发生原则是指JMM中定义两项操作之间依序关系 如果说操作A先行发生于操作B,就是在说发生B前,A产生影响能被B观察到,“影响”包含了修改内存中共享变量值、发送了消息、调用了方法等。 传递性(Transitivity):如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C结论。 一个操作”时间上发生“不代表这个操作会是”先行发生“,那 如果一个操作”先行发生“是否就能推导出这个操作必定是”时间上发生“呢?也是不成立,一个典型例子就是指令重排序。 所以时间上先后顺序与先生发生原则之间基本没有什么关系,所以衡量并发安全问题一切必须以先行发生原则为准。

    1.5K100发布于 2018-05-16
  • 来自专栏历史专栏

    【愚公系列】2023年11月 通用职责分配原则(八)-中介原则(Indirection Principle)

    欢迎 点赞✍评论⭐收藏前言GRASP(General Responsibility Assignment Software Patterns)通用职责分配软件模式是一组用于面向对象设计指导原则,旨在帮助设计者确定系统中各个类职责和交互方式 GRASP与GOF(Gang of Four)模式区别在于,GOF模式是一组特定设计模式,提供了常见问题解决方案,而GRASP则是一组通用解决问题原则,帮助设计者确定系统中各个类职责和交互方式 具体而言,GRASP提供了以下指导原则:Creator:谁创建了对象,谁就应该负责管理对象之间关系。Controller:将系统控制逻辑集中到一个对象中。 Pure Fabrication:创建一个虚拟类,以承担一些职责。GRASP提供了一些通用、可重用模式,可以帮助设计者更好地理解和应用面向对象设计原则。 一、中介原则(Indirection Principle)中介原则是通用职责分配原则一种,指的是将职责转移给中介对象来实现。

    28611编辑于 2023-11-30
  • 来自专栏历史专栏

    【愚公系列】2023年11月 通用职责分配原则(六)-多态原则(Polymorphism Principle)

    GRASP与GOF(Gang of Four)模式区别在于,GOF模式是一组特定设计模式,提供了常见问题解决方案,而GRASP则是一组通用解决问题原则,帮助设计者确定系统中各个类职责和交互方式 Pure Fabrication:创建一个虚拟类,以承担一些职责。GRASP提供了一些通用、可重用模式,可以帮助设计者更好地理解和应用面向对象设计原则。 一、多态原则(Polymorphism Principle)多态原则是指子类对象可以替代父类对象,并且具体执行时会根据实际子类对象类型来调用相应方法,从而实现不同行为表现。 在职责分配中,多态原则通常被用来实现开闭原则,即通过抽象类或接口定义通用行为规范,具体子类实现具体行为逻辑,新增功能时只需要添加新子类即可,而不会影响已有的代码结构。 同时,多态原则也可以提高代码灵活性和可扩展性,减少代码耦合度和复杂度。

    32611编辑于 2023-11-30
  • 来自专栏巴啦啦的积累

    《架构整洁之道》第 11 章 DIP:依赖反转原则

    均为原创,读架构整洁之道笔记。依赖反转原则:(DIP :Dependency Inversion Principle)。 但做不到完全引用接口或抽象类,如Java中String,就是一个具体实现,如类似的非常稳定类,系统原生提供类,则不在此依赖反转范围内。我们应当关注自己业务中,容易变动模块。 稳定抽象层为什么要使用抽象,而非具体实现呢?因为每当我们修改接口时,就必然伴随着去修改那些具体实现。但我们修改具体实现时,却很少修改对应接口。 这就可以认定,接口比实现稳定,如果想要追求架构上稳定,就必须多使用抽象,少依赖多变具体实现。具体编码守则:多使用抽象接口,尽可能避免依赖多变具体实现。 避免在代码中写入任何具体实现相关名字,如写死类名。或是其他容易变动事物名字。

    62220编辑于 2023-05-27
  • 来自专栏明志德到的IT笔记

    《软件开发201个原则》—— 一般原则、需求原则、设计原则、编码原则、测试原则、管理原则、产品原则、演变原则

    现存原则发生改变,新原则会被加进来,旧原则将不再适用。实践和从实践中获得经验,促使我们发展了那些原则。 这些方法包括:让客户参与(见原则8)、原型设计(在全面开发之前验证需求;见原则11~13)、保持设计简单(见原则67) 、审查代码(见原则98)和雇用最优秀的人(见原则130和131) 。 (见原则11、12、13、42)。 :Prentice Hall, 1993, Section 3.4、11. 原则50 给需求排列优先级 并非所有需求都是同样重要。 在设立基线前,要确认需求和设计是正确且合适,在对最终产品编码前更要确认。附带说一下,不要从这个原则推断出原型试验方法有问题(见原则5、10、11、12、13)。

    1.9K20编辑于 2023-10-21
  • 来自专栏历史专栏

    【愚公系列】2023年11月 通用职责分配原则(三)-低耦合原则(Low Coupling Principle)

    GRASP与GOF(Gang of Four)模式区别在于,GOF模式是一组特定设计模式,提供了常见问题解决方案,而GRASP则是一组通用解决问题原则,帮助设计者确定系统中各个类职责和交互方式 一、低耦合原则(Low Coupling Principle)低耦合原则是指在软件设计和开发中,模块之间应该尽可能地减少相互依赖,降低模块之间耦合度,以实现模块独立、维护方便、复用性高目标。 低耦合性是软件设计和开发中重要原则之一,也是实现模块化设计基础。低耦合原则实现可以通过以下方法来达到:接口分离原则:尽量将接口进行细化,只暴露需要使用最小接口。 解耦合框架原则:使用框架或类库时,尽量选用松散耦合框架或类库,避免使用紧耦合框架或类库。依赖注入原则:通过依赖注入和控制反转等技术,将依赖关系从代码中移除,降低模块之间耦合度。 消息通信原则:使用消息通信方式,将模块之间通信降到最低。通过消息队列等技术,实现模块之间松散耦合。低耦合原则可以提高软件可维护性、可扩展性和可测试性,是软件设计和开发重要原则之一。

    30911编辑于 2023-11-30
  • 来自专栏历史专栏

    【愚公系列】2023年11月 面向对象设计原则(三)-里氏替换原则(Liskov Substitution Principle or LSP)

    欢迎 点赞✍评论⭐收藏前言面向对象设计原则是一些通用软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护软件系统。 这些原则作用如下:提高软件系统可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注模块,从而降低代码复杂性和耦合度,提高系统可读性和可维护性。 提高软件系统可扩展性:开放封闭原则可以帮助软件系统更容易地适应变化,降低对现有代码影响,从而提高软件系统可扩展性和灵活性。 提高软件系统重用性:接口隔离原则可以将接口分解为更小、更专注部分,提高代码可读性和可复用性,从而提高软件系统重用性。 提高软件质量:通过遵循面向对象设计原则,软件设计人员可以避免一些常见设计错误,从而提高软件系统质量和可靠性。遵循面向对象设计原则可以帮助软件设计人员开发高质量、可扩展、可维护和重用软件系统。

    42921编辑于 2023-11-24
  • 来自专栏历史专栏

    【愚公系列】2023年11月 面向对象设计原则(六)-合成复用原则(Composite Reuse Principle or CRP)

    欢迎 点赞✍评论⭐收藏前言面向对象设计原则是一些通用软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护软件系统。 这些原则作用如下:提高软件系统可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注模块,从而降低代码复杂性和耦合度,提高系统可读性和可维护性。 提高软件系统重用性:接口隔离原则可以将接口分解为更小、更专注部分,提高代码可读性和可复用性,从而提高软件系统重用性。 提高软件质量:通过遵循面向对象设计原则,软件设计人员可以避免一些常见设计错误,从而提高软件系统质量和可靠性。遵循面向对象设计原则可以帮助软件设计人员开发高质量、可扩展、可维护和重用软件系统。 另外如果修改基类中任何一个功能,所有继承自BankCard类可能都要重写,这显然也不符合开闭原则。转账方法使用BankCard类型参数,显然不符合里氏替换原则

    42311编辑于 2023-11-27
  • 来自专栏历史专栏

    【愚公系列】2023年11月 通用职责分配原则(五)-控制器原则(Controller Principle)

    GRASP与GOF(Gang of Four)模式区别在于,GOF模式是一组特定设计模式,提供了常见问题解决方案,而GRASP则是一组通用解决问题原则,帮助设计者确定系统中各个类职责和交互方式 一、控制器原则(Controller Principle)控制器原则是通用职责分配原则一种,在软件系统中,控制器负责协调和控制系统中各个部分,确保它们能够协同工作,以实现系统整体目标。 控制器原则核心思想是将系统分成若干个组件或模块,然后将这些组件或模块分配给不同控制器,每个控制器负责管理自己所控制组件或模块。 控制器原则优点是可以将系统分解成若干个独立组件或模块,每个组件或模块都有自己职责和功能,从而提高系统可维护性、可扩展性和可重用性。 此外,控制器原则还可以提高系统灵活性和可测试性,因为每个组件或模块都可以独立测试和调试。

    32511编辑于 2023-11-30
  • 来自专栏历史专栏

    【愚公系列】2023年11月 面向对象设计原则(四)-依赖倒置原则(Dependence Inversion Principle DIP)

    欢迎 点赞✍评论⭐收藏前言面向对象设计原则是一些通用软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护软件系统。 这些原则作用如下:提高软件系统可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注模块,从而降低代码复杂性和耦合度,提高系统可读性和可维护性。 提高软件质量:通过遵循面向对象设计原则,软件设计人员可以避免一些常见设计错误,从而提高软件系统质量和可靠性。遵循面向对象设计原则可以帮助软件设计人员开发高质量、可扩展、可维护和重用软件系统。 通过上面的分析我们不难发现,本来高层模块依赖低层模块,经过代码改造后,变成了它们都依赖于抽象,即依赖发生了转移,这就是所谓“依赖倒置原则”。 总结依赖倒置原则主要作用如下。依赖倒置原则可以降低类间耦合性。依赖倒置原则可以提高系统稳定性。依赖倒置原则可以减少并行开发引起风险。依赖倒置原则可以提高代码可读性和可维护性。

    40011编辑于 2023-11-25
  • 来自专栏历史专栏

    【愚公系列】2023年11月 通用职责分配原则(二)-创造者原则(Creator Principle)

    GRASP与GOF(Gang of Four)模式区别在于,GOF模式是一组特定设计模式,提供了常见问题解决方案,而GRASP则是一组通用解决问题原则,帮助设计者确定系统中各个类职责和交互方式 Pure Fabrication:创建一个虚拟类,以承担一些职责。GRASP提供了一些通用、可重用模式,可以帮助设计者更好地理解和应用面向对象设计原则。 一、创造者原则(Creator Principle)创造者原则是通用职责分配原则之一,它指定某些对象承担创建其他对象职责。 在软件系统中,对象之间关系和互动非常复杂,因此需要对各个对象职责进行合理分配,以确保系统能够高效地运行。根据创造者原则,一个对象应该只负责创建其他对象,而不应该承担其他对象职责。 这有助于降低对象之间耦合度,使系统更容易维护和扩展。同时,这也符合面向对象设计中单一职责原则,即每个对象应该只承担一个职责。

    29111编辑于 2023-11-30
  • 来自专栏历史专栏

    【愚公系列】2023年11月 通用职责分配原则(一)-信息专家原则(Information Expert Principle)

    GRASP与GOF(Gang of Four)模式区别在于,GOF模式是一组特定设计模式,提供了常见问题解决方案,而GRASP则是一组通用解决问题原则,帮助设计者确定系统中各个类职责和交互方式 Pure Fabrication:创建一个虚拟类,以承担一些职责。GRASP提供了一些通用、可重用模式,可以帮助设计者更好地理解和应用面向对象设计原则。 一、信息专家原则(Information Expert Principle)通用职责分配原则信息专家原则(Information Expert Principle),是指将某种特定行动职责分配给掌握有关信息专家 这个原则可以用于设计系统、制定组织结构和分配任务。例如,在设计软件程序时,将一个模块职责分配给能够提供必要信息开发人员,可以提高开发效率和质量。 在公司运营中,将人力管理职责分配给人力资源部门,可以更好地管理员工,提高企业绩效。通用职责分配原则信息专家原则非常实用,可用于指导各种类型组织和活动,例如企业管理、项目管理、软件开发等。

    38311编辑于 2023-11-29
  • 来自专栏历史专栏

    【愚公系列】2023年11月 面向对象设计原则(五)-接口隔离原则(Interface Segregation Principle or ISP)

    欢迎 点赞✍评论⭐收藏前言面向对象设计原则是一些通用软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护软件系统。 这些原则作用如下:提高软件系统可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注模块,从而降低代码复杂性和耦合度,提高系统可读性和可维护性。 提高软件系统重用性:接口隔离原则可以将接口分解为更小、更专注部分,提高代码可读性和可复用性,从而提高软件系统重用性。 提高软件质量:通过遵循面向对象设计原则,软件设计人员可以避免一些常见设计错误,从而提高软件系统质量和可靠性。遵循面向对象设计原则可以帮助软件设计人员开发高质量、可扩展、可维护和重用软件系统。 总结我们将接口功能最小化,每一个接口只负责与其自身相关功能,防止功能过多导致“接口污染”问题,符合接口隔离原则,并且有利于未来扩展,同时符合开闭原则

    36621编辑于 2023-11-26
领券