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

    Java先行发生原则

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

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

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

    先行发生”(happens-before)原则。 一、什么是先行发生原则 现在就来看看“先行发生原则指的是什么。 线程启动规则(Thread Start Rule):Thread对象start()方法先行发生于此线程每一个动作。 5. ,根据程序次序规则,“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种设计原则(5)-里氏代换原则

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

    1.4K20发布于 2020-08-04
  • 5个多云安全原则

    在这篇文章中,我们将介绍当您转移到多云环境时应该努力五个原则。但首先,让我们来看看主要参与者。 当DevOps团队成员决定为他们特定用例做最好事情时,可能会发生这种情况,而不考虑整个组织最佳状况。 Azure列出(并更新)了一系列涵盖各种云安全主题文章,Google云端平台共享了一系列最佳实践。当然,这里有很多重叠,并且适用一些通用规则,例如: 随时了解您环境中发生了什么。 5.坚持共同责任模式 最后,确保你了解共同责任模式。我们之前已经写过关于它含义和现在模型状态。 在过去5年中,79%企业经历了实际上已经转化为重大运营意外风险(2017年Gartner安全与风险管理峰会)。

    1.6K110发布于 2018-02-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
  • 来自专栏hbbliyong

    设计模式学习--面向对象5条设计原则之依赖倒置原则--DIP

    缺点:耦合太紧密,Light发生变化将影响ToggleSwitch。 解决办法一: 将Light作成Abstract,然后具体类继承自Light。 ? 优点:ToggleSwitch依赖于抽象类Light,具有更高稳定性,而BulbLight与TubeLight继承自Light,可以根据"开放-封闭"原则进行扩展。 只要Light不发生变化,BulbLight与TubeLight变化就不会波及ToggleSwitch。 缺点:如果用ToggleSwitch控制一台电视就很困难了。 三、DIP优点: 使用传统过程化程序设计所创建依赖关系,策略依赖于细节,这是糟糕,因为策略受到细节改变影响。依赖倒置原则使细节和策略都依赖于抽象,抽象稳定性决定了系统稳定性。 四、启发式规则: 1、任何变量都不应该持有一个指向具体类指针或者引用 2、任何类都不应该从具体类派生(始于抽象,来自具体) 3、任何方法都不应该覆写它任何基类中已经实现了方法

    1K80发布于 2018-03-05
  • 来自专栏hbbliyong

    设计模式学习--面向对象5条设计原则之开放封闭原则--OCP

    ,使程序模块互换成为可能; 2、使软件各部分便于单元测试,通过编制与接口一致模拟类(Mock),可以很容易地实现软件各部分单元测试; 3、利于实现软件模块呼唤,软件升级时可以只部署发生变化部分 ,而不会影响其它部分; 四、使用OCP注意点: 1、实现OCP原则关键是抽象; 2、两种安全实现开闭原则设计模式是:Strategy pattern(策略模式),Template Methord (模版方法模式); 3、依据开闭原则,我们尽量不要修改类,只扩展类,但在有些情况下会出现一些比较怪异状况,这时可以采用几个类进行组合来完成; 4、将可能发生变化部分封装成一个对象,如: 状态, 消息 ,,算法,数据结构等等 , 封装变化是实现"开闭原则"一个重要手段,如经常发生变化状态值,如温度,气压,颜色,积分,排名等等,可以将这些作为独立属性,如果参数之间有关系,有必要进行抽象。 对于行为,如果是基本不变,则可以直接作为对象方法,否则考虑抽象或者封装这些行为; 5、在许多方面,OCP是面向对象设计核心所在。

    95180发布于 2018-03-05
  • 来自专栏hbbliyong

    设计模式学习--面向对象5条设计原则之Liskov替换原则--LSP

    子类型必须能够替换它基类型。LSP又称里氏替换原则。 对于这个原则,通俗一些理解就是,父类方法都要在子类中实现或者重写。 但是,光有依赖倒置原则,并不一定就使我们代码真正具有良好扩展性和运行期内绑定。 现在看来,一个系统或子系统要拥有良好扩展性和实现运行期内绑定,有两个必要条件:第一是依赖倒置原则;第二是里氏替换原则。这两个原则缺一不可。 四、使用LSP注意点: 1、此原则和OCP作用有点类似,其实这些面向对象基本原则就2条:1:面向接口编程,而不是面向实现;2:用组合而不主张用继承 2、LSP是保证OCP重要原则 3、这些基本原则在实现方法上也有个共同层次 5、从派生类抛出异常:如果在派生类方法中添加了其基类不会抛出异常。如果基类使用者不期望这些异常,那么把他们添加到派生类方法中就可以能会导致不可替换性。

    1.1K50发布于 2018-03-05
  • 来自专栏hbbliyong

    设计模式学习--面向对象5条设计原则之接口隔离原则--ISP

    一、ISP简介(ISP--Interface Segregation Principle): 使用多个专门接口比使用单一总接口要好。 一个类对另外一个类依赖性应当是建立在最小接口上。 一个接口代表一个角色,不应当将不同角色都交给一个接口。没有关系接口合并在一起,形成一个臃肿大接口,这是对角色和接口污染。 “不应该强迫客户依赖于它们不用方法。 接口属于客户,不属于它所在类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们不用方法,如果强迫用户使用它们不使用方法,那么这些客户就会面临由于这些不使用方法改变所带来改变。 二、举例说明: 参考下图设计,在这个设计里,取款、存款、转帐都使用一个通用界面接口,也就是说,每一个类都被强迫依赖了另两个类接口方法,那么每个类有可能因为另外两个类方法(跟自己无关)而被影响。 参考下图设计,为每个类都单独设计专门操作接口,使得它们只依赖于它们关系方法,这样就不会互相影了! ? 三、实现方法: 1、使用委托分离接口 2、使用多重继承分离接口

    82780发布于 2018-03-05
  • 来自专栏hbbliyong

    设计模式学习--面向对象5条设计原则之单一职责原则--SRP

    所谓职责,我们可以理解他为功能,就是设计这个类功能应该只有一个,而不是两个或更多。也可以理解为引用变化原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了。 因为职责是变化一个轴线,当需求变化时,该变化会反映类职责变化。 “就像一个人身兼数职,而这些事情相互关联不大,,甚至有冲突,那他就无法很好解决这些职责,应该分到不同的人身上去做才对。” 二、举例说明: 违反SRP原则代码:  modem接口明显具有两个职责:连接管理和数据通讯; interface Modem {     public void dial(string pno);     ,应该仅有一个引起它变化原因,即单一职责;  2、在没有变化征兆情况下应用SRP或其他原则是不明智;  3、在需求实际发生变化时就应该应用SRP等原则来重构代码;  4、使用测试驱动开发会迫使我们在设计出现臭味之前分离不合理代码 ;  5、如果测试不能迫使职责分离,僵化性和脆弱性臭味会变得很强烈,那就应该用Facade或Proxy模式对代码重构;

    913100发布于 2018-03-05
  • 选择多平台云遵循5条安全原则

    在这篇文章中,我们将介绍当从单一服务商转移到多平台云环境时应该警惕五个原则。首先,让我们来看看世界上有哪些主要云平台供应商。 但可能会发生这种情况,为了自身特定用例只考虑“开发和操作”(DevOps "development" and "operations")结构而忽略整体环境影响来做云平台选择。 微软Azure列出(并更新)了一系列涵盖各种云安全主题文章,Google云端平台共享了一系列最佳实践。当然,这里有很多重复说明文章,总结其中一些通用规则: 随时了解您环境中发生了什么。 5.坚持共同责任模式 最后,确保了解共同责任模式。之前已经写过关于它含义,也描述了当今共同责任模式状态。 在过去5年中,79%企业经历了实际上已经转化为重大运营意外风险(2017年Gartner安全与风险管理峰会)。

    1.4K80发布于 2018-02-08
  • 来自专栏软件系统思考

    系统设计中5个非常重要原则

    前言整理下多年系统设计经验,抛砖引玉,助力大家系统设计能力提升。法则一:卓越架构是演进来,不是设计来新手最容易陷入诱惑是追求“宏篇大作”,一份在项目启动之初就构想得尽善尽美的设计。 真正老手知道,业务总是不断变化,大部分业务生命周期很短,其实设计太好太完美的系统,可能发挥不出来,业务就已经黄了,徒耗费精力。架构演进根本动力,源于不断变化业务需求。 领域层:负责核心领域业务逻辑实现。基础层:为各层提供资源服务。必须严格遵守“上层调用下层”单向依赖原则,服务粒度由内向外、由细到粗。 真正解耦,源自于深入服务内部严格划分与清晰边界,而非仅仅采用了某种流行架构模式。法则三:数据库驱动 or 领域驱动接到产品经理提需求后,你第一反应是什么? 总结牛逼架构设计,并非遵循僵化教条,而是充满了对业务理解、对演进接受和在矛盾中寻求最佳平衡艺术。

    23900编辑于 2026-01-14
  • 来自专栏ThoughtWorks

    TW洞见 | 成为好QA5项黄金原则

    你知道当所有的测试都失败,有人不停地问你到底哪出错了时候,什么能让你内心仍然很坚强吗? 好吧,我不知道。至少没有意识到。 但咨询师这个角色,教会了我们关于人很多事情:他们怎样和团队成员交互,以及如何做决定并实现它们。

    638100发布于 2018-04-20
  • 来自专栏云计算D1net

    评估公有云和私有云5个核心原则

    当企业衡量和评估私有云和公有云时,应该注意其中5个核心原则: 1.易于使用 IT部门职责不仅是技术实施,还要对IT系统进行运营维护和支持。 不幸是,从运营和使用角度来讲,新技术往往会耗费时间和资源。如今公有云技术需要IT团队学习新词汇和新运营技巧。 虽然公有云基础设施能确保在最大程度上得到有效保护,但是其部署依赖于对新安全模式精通,还需要应用程序与新APIs和工具一致性。 企业本地部署私有云,以其灵活配置能力,历来被宣扬成一个将传统基础设施与正在流行云环境进行连接较容易方式。但是这些本地功能缺失弹性基础设施那些好处,而且仍然需要资金投入。 5.弹性能力 云基础设施其中一个主要优点是它弹性能力。公有云提供商将其看成一个很大特点。但是弹性能力在私有云技术堆栈中却一直难以实现。

    3.7K40发布于 2018-03-15
  • 来自专栏明志德到的IT笔记

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

    现存原则发生改变,新原则会被加进来,旧原则将不再适用。实践和从实践中获得经验,促使我们发展了那些原则。 与原则185和201 (强调软件部署后,需求可能发生巨大变化)不同,本原则想表达,在开发过程中,软件也可能发生巨大变化。这些变化可能体现在编写新代码、新测试计划或新需求规格说明上。 在设立基线前,要确认需求和设计是正确且合适,在对最终产品编码前更要确认。附带说一下,不要从这个原则推断出原型试验方法有问题(见原则5、10、11、12、13)。 现在距离计划交付日期还有一个月。假设50%组件已经完成了单元测试。通过简单计算可以得知,你落后进度5个月。你现在有两个选择: 1 向你客户承认5个月延误:请求推迟交付。 为了避免这种情况发生,要确保你正在做变更是经过核准(见原则182及183),对每项变更进行核查(见原则97),并在每组变更后进行回归测试(见原则196)。

    1.9K20编辑于 2023-10-21
  • 来自专栏机器学习算法与Python学习

    5原则教你Debug神经网络

    对此,在单一工具之外,Cecelia Shao 通过提供一种思路以表达她对调试神经网络所遵循五项原则: 从繁就简 确认模型损失 检查中间输出和连接 诊断参数 追踪工作 1. 首先,构建一个相对简单模型:构建一个具有单个隐藏层小模型,并进行验证;然后逐渐添加模型复杂性,同时检验模型结构每个层面(附加层、参数等)是否有效。 除了关注梯度绝对值之外,还要确保监视每个层匹配激活、权重大小。例如,参数更新大小(权重和偏差)应为 1-e3。 关于可视化神经网络主要方法,Faizan Shaikh 举出了三个例子: 初始方法:展现训练模型整体结构,这些方法包括展示神经网络各个层形状或过滤器(filters)以及每个层中参数; 基于激活方法 结果,网络必须在每个训练 batch 中使用不同参数子集,这减少了特定参数变化而变得优于其他参数。 5. 全程跟踪工作 通过对工作更好地跟踪,可以轻松查看和重现之前试验,以减少重复工作。

    1.7K20发布于 2019-07-04
领券