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

    Java先行发生原则

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

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

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

    先行发生”(happens-before)原则。 一、什么是先行发生原则 现在就来看看“先行发生原则指的是什么。 7. 对象终结规则(Finalizer Rule):一个对象初始化完成(构造函数执行结束)先行发生于它finalize()方法开始。 8. ,根据程序次序规则,“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
  • 来自专栏国产程序员

    面向对象7种设计原则(7)-开闭原则

    开闭原则 开闭原则是面向对象世界里最基础设计原则,它指导我们如何建立一个稳定,灵活,可扩展系统。 一个软件产品只要在生命周期内,都会发生变化,即然变化是一个事实,我们就应该在设计时尽量适应这些变化,以提高项目的稳定性和灵活性,真正实现“拥抱变化”。 但是对于这样一个修改方式,首先,作为接口,ICar应该稳定且可靠,不应该经常发生改变,否则接口作为契约作用就失去了。 为什么使用开闭原则 第一:开闭原则非常有名,只要是面向对象编程,在开发时都会强调开闭原则 第二:开闭原则是最基础设计原则,其它五个设计原则都是开闭原则具体形态,也就是说其它五个设计原则是指导设计工具和方法 依照Java语言称谓,开闭原则是抽象类,而其它五个原则是具体实现类。

    62410发布于 2020-08-27
  • 来自专栏国产程序员

    面向对象7种设计原则(2)-接口隔离原则

    接口应该尽量细化,一个接口对应一个功能模块,同时接口里面的方法应该尽可能少,使接口更加灵活轻便。或许有的人认为接口隔离原则和单一职责原则很像,但两个原则还是存在着明显区别。 单一职责原则是在业务逻辑上划分,注重是职责。接口隔离原则是基于接口设计考虑。 例如一个接口职责包含10个方法,这10个方法都放在同一接口中,并且提供给多个模块调用,但不同模块需要依赖方法是不一样,这时模块为了实现自己功能就不得不实现一些对其没有意义方法,这样设计是不符合接口隔离原则 接口隔离原则要求"尽量使用多个专门接口"专门提供给不同模块。 它就会被迫实现“讲课”这个方法,事实它是不需要该方法。这就造成了代码冗余,使我们代码变得臃肿。 解决 将臃肿接口I拆分为独立几个接口,类A和类C分别与他们需要接口建立依赖关系。 ?

    96410发布于 2020-07-13
  • 来自专栏国产程序员

    面向对象7种设计原则(3)-依赖倒置原则

    依赖倒置原则 High level modules should not depend upon low level modules.Both should depend upon abstractions 高层模块不应该依赖低层模块,两者都应该依赖其抽象(模块间依赖通过抽象发生,实现类之间不发生直接依赖关系,其依赖关系是通过接口或抽象类产生) Abstractions should not depend 由于RunTu是一个高级模块并且是一个细节实现类,此类依赖了书籍Java和Linux又是一个细节依赖类,这导致RunTu每读一本书都需要修改代码,这与我们依赖倒置原则是相悖。 this.iBook = iBook; } void study() { this.iBook.bookName(); } } 总结 依赖倒置原则本质就是通过抽象 我们在项目中使用这个原则要遵循下面的规则: 每个类尽量都有接口或者抽象类,或者抽象类和接口两都具备 变量表面类型尽量是接口或者抽象类 任何类都不应该从具体类派生 尽量不要覆写基类方法 如果基类是一个抽象类

    70930发布于 2020-07-28
  • 来自专栏国产程序员

    面向对象7种设计原则(5)-里氏代换原则

    定义 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计基本原则之一。里氏代换原则中说,任何基类可以出现地方,子类一定可以出现。 LSP是继承复用基石,只有当衍生类可以替换掉基类,软件单位功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类基础上增加新行为。里氏代换原则是对“开-闭”原则补充。 实现“开-闭”原则关键步骤就是抽象化。而基类与子类继承关系就是抽象化具体实现,所以里氏代换原则是对实现抽象化具体步骤规范。 原则 第一点 子类必须实现父类抽象方法,但不得重写(覆盖)父类非抽象(已实现)方法。 : 父类方法执行 将父类对象替换为子类对象调用结果 子类方法执行 我们本意是希望对象替换后还执行原来方法,可结果却发生变化了。

    1.4K20发布于 2020-08-04
  • 来自专栏深入浅出Java

    Java并发设计7原则

    Java并发设计7原则在Java并发编程世界中,高效且安全地管理线程交互是一项至关重要挑战本文基于Effective Java 并发章节总结7原则这些原则旨在帮助开发者规避常见并发陷阱,确保程序在多线程环境下正确性和性能表现同步访问共享可变数据在并发中多线程同时访问共享可变数据是线程不安全 ,主线程修改对启动线程是不可见(类比缓存、内存)为了保证可见性,我们需要施加一些手段,比如加同步锁,通过加锁方式保证可见性 private static void methodSync() 、使用JUC包下一些并发组件,它们不盲目的使用同步,而是结合volatile保证读数据可见性和一些同步手段来实现写操作数据一致性,从而成为高性能并发组件/容器感兴趣同学也可以查看并发专栏下并发组件 、notifywait、notify结合synchronized实现等待通知模式并发包下基于AQS实现并发工具(CountDownLatch...)能更方便解决wait\notify能解决问题除非要维护老项目使用 fork join框架都优于单独使用线程并发包下工具使用更简单,了解后尽量使用并发包下工具对于可能被并发调用类需要声明线程安全性文档:绝对线程安全、相对线程安全、线程不安全等延迟初始化只是把初始化开销放到第一次使用

    18721编辑于 2024-08-01
  • 来自专栏国产程序员

    面向对象7种设计原则(1)-单一职责原则

    永远不要让一个类存在多个改变理由。 单一原则表明,如果你有多个原因去改变一个类,那么应该把这些引起变化原因分离开,把这个类分成多个类,每个类只负责处理一种改变。 当我们去改变一个具有多个职责类时可能会影响该类其他功能 单一职责原则代表了设计应用程序时一种很好识别类方式,并且它提醒你思考一个类所有演化方式。 只有对应用程序工作方式有了很好理解,才能很好分离职责。 单一职责原则原则核心含意是:只能让一个类/接口/方法有且仅有一个职责。 ."); } } } 第三种: 这种修改方式没有改动原来方法,而是在类中新加了一个方法,这样虽然也违背了单一职责原则,但在方法级别上却是符合单一职责原则,因为它并没有动原来方法代码 void run3(String animal){ System.out.println(animal+"swimming in the water..."); } } 单一职责原则虽然它是最简单但又最难运用原则

    50110发布于 2020-07-13
  • 来自专栏国产程序员

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

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

    70540发布于 2020-08-17
  • 来自专栏国产程序员

    面向对象7种设计原则(4)-合成聚合复用原则

    合成复用原则 在一个新对象里面使用一些已有的对象,使之成为新对象一部分;新对象通过向这些对象委派达到复用这些对象目的。 使用程序语言术语来说,合成而成新对象对组成部分内存分配、内存释放有绝对责任。一个合成关系成分对象是不能与另一个合成关系共享。 因为超类内部细节常常对子类是透明,因此这种复用是透明复用,又叫“白箱”复用。 如果超类实现改变了,那么子类实现也不得不发生改变。 因此,当一个基类发生了改变时,这种改变会传导到一级又一级子类,使得设计师不得不相应改变这些子类,以适应超类变化。 从超类继承而来实现是静态,不可能在运行时间内发生变化,因此没有足够灵活性。 由于继承复用有以上缺点,所有尽量使用合成/聚合而不是继承来达到对实现复用,是非常重要设计原则

    1.5K40发布于 2020-07-28
  • 来自专栏木宛城主

    Unity应用架构设计(7)——IoC工厂理念先行

    一谈到 『IoC』,有经验程序员马上会联想到控制反转,将创建对象责任反转给工厂。IoC是依赖注入 『DI』 核心,大名鼎鼎Spring框架就是一个非常卓越控制反转、依赖注入框架。 遗憾是,我们显然不能在Unity 3D中去使用Spring框架,但思想是相通——IoC也好,控制反转也罢,本质上是一个工厂,或者又被称为容器,我们可以自己维护一个工厂来实现对对象管理,这也是本文核心内容 这就是工厂动机,对对象创建和释放进行管理,这样可以有效提高效率。 ? Singleton :该工厂生产对象是单例,即一旦生产出来对象将处理所有的请求,不会因为不同请求而产生新对象,通常需要考虑多线程并发问题 Transient :该工厂生产对象是临时,转瞬即逝 这一章工厂模式很重要,也是对下一篇对象注入『Inject』做准备,故称之为理念先行。 源代码托管在Github上,点击此了解

    1K70发布于 2018-03-28
  • 来自专栏DevOps时代的专栏

    高效持续交付 7原则

    举个例子,浏览器和社交媒体站点每天都会进行多次交付,那些想要跟上信息时代步伐企业,都在实施持续交付。为了确保持续交付成功,有几个每个企业都需要知道持续交付原则。 这里有7个能够使开发和交付周期变得高效持续交付原则: 自动化,自动化,自动化。虽然越来越多组织认识到他们端到端发布流程和交付对自动化需要,但是如果我们没有正确使用它,它将会成为负担。 如前所述,自动化测试是持续交付关键,并且你也不想在QA和开发之间会出现瓶颈,堵塞你流程。 小发布版本。持续交付核心原则之一是更小和更多发布版本通常要好于一个大发布版本。 它很重要,然而,不论是你正在将他引入到你组织当中,还是想要优化你持续交付方法,你都需要使用正确持续集成原则,来保持你素质更快和更有效率。 原文:https://devops.com/7-highly-effective-continuous-delivery-principles/ 翻译:虫虫 转载:https://blog.csdn.net

    1K20发布于 2018-08-01
  • 来自专栏一个会写诗的程序员的博客

    7 大程序设计原则

    将大牛们经验总结到一起,可以得到以下「7 大程序设计原则」 。这些设计原理源于对实际软件开发现场分析,是提高代码质量经验结晶。 让我们一起一探究竟吧! 我们还要考虑到例外情况并极力避免其发生。例外情况特殊性会破坏对称性,成为故障温床。特殊情况过多意味着需求没有得到整理。此时应重新审视需求,尽量从代码中剔除例外情况。 命名也要讲究对称性。 这样一来就可以提高代码可读性,帮助程序员表达编码意图,降低 bug 发生概率。 Do:编写有抽象层次结构代码 在编写代码时设计各部分抽象程度,构建层次结构。 06 清晰原则 Clarity Principle What:注意逻辑清晰性 清晰原则就是注意逻辑清晰性。 逻辑具有清晰性就代表逻辑能清楚证明自身正确性。 07 安全原则 Safty Principle What:注意安全性 安全原则就是注意安全性,采用相对安全方法来对具有不确定性、模糊部分进行设计和编程。

    1.4K31发布于 2021-05-06
  • 来自专栏独立观察员博客

    7种常用面向对象设计原则

    包括: 1、设计方案和代码复用 2、系统要易于扩展和修改 面向对象设计原则就可以作为上述目标的指导方针,这些原则蕴含在很多设计模式中,是前辈们从许多设计方案中总结出来指导性原则。 最常用7种设计原则: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中相应职责 开闭原则(Open-Closed Principle , ISP):使用多个专门接口,而不是一个单一总接口 合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是使用继承来达到复用目的。 迪米特法则(Law of Demeter, LoD):一个软件实体应该尽可能少与其它软件实体发生相互作用。 以上设计原则,如果你项目中有真真切切落实几个,那么你代码可扩展性和可维护性都将会有很大提高。 参考资料:

    37630编辑于 2022-12-06
  • 来自专栏web前端教室

    先行者计划QQ群视频 | 7月15日

    今天先行者计划群视频,主要内容就是下面PPT内容,然后扩展开讲了一下用switch写前端路由思路方向。

    58370发布于 2018-02-06
  • 来自专栏贝克街的捉虫师

    软件测试7个基本原则

    我们需要某些原则和策略来优化测试工作 以下是7原则 1、不可能进行详尽测试 是的!不可能进行详尽测试。相反,我们需要根据应用程序风险评估来确定最佳测试量。 为了解决这个问题,下一个测试原则指出:“尽早测试” 6、尽早测试 尽早测试-测试应在软件开发生命周期中尽早开始。这样就可以在早期阶段捕获需求或设计阶段中任何缺陷。在测试早期阶段修复缺陷要便宜得多。 有关此原则更多信息,请参阅后面的培训教程。 7、测试跟业务相关 测试是依赖于业务,这基本上意味着您测试电子商务站点方式将不同于您测试桌面应用程序方式。所有开发软件都不相同。 七项测试原则总结 原则1 测试仅表明存在缺陷 原则2 不可能进行详尽测试 原则3 尽早介入测试 原则4 缺陷群聚效应 原则5 杀虫剂悖论 原则6 测试跟业务相关 原则7 错误不可避免 “原则仅供参考 但是,随着经验积累,您只需专注于驱动其余部分就自然而然地发生了。这样您甚至可以与车内其他乘客进行对话。 测试原则也是如此。经验丰富测试人员已经将这些原则内化到了即使不考虑也可以应用水平。

    2.6K10发布于 2020-05-15
领券