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

    Java先行发生原则

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

    43430编辑于 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

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

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

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

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

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

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

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

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

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

    1.7K40发布于 2018-03-16
  • 来自专栏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
  • 来自专栏明志德到的IT笔记

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

    现存原则发生改变,新原则会被加进来,旧原则将不再适用。实践和从实践中获得经验,促使我们发展了那些原则。 与原则185和201 (强调软件部署后,需求可能发生巨大变化)不同,本原则想表达,在开发过程中,软件也可能发生巨大变化。这些变化可能体现在编写新代码、新测试计划或新需求规格说明上。 原则21 不同阶段,使用不同语言 业界对“用简单方法解决复杂问题”永恒渴望(见原则19),促使许多人宣称:最佳软件开发方法,是在整个开发生命周期中使用相同符号表达方法。 原则162强调需要预先分析所有潜难,提前制订应急计划,并不断重新评估新风险。本原则强调需要预想这些风险成为现实。最大管理灾难会在你认为不会发生时候出现。 为了避免这种情况发生,要确保你正在做变更是经过核准(见原则182及183),对每项变更进行核查(见原则97),并在每组变更后进行回归测试(见原则196)。

    1.8K20编辑于 2023-10-21
  • 来自专栏人工智能快报

    深度学习起源与先行

    在二十世纪五十年代就存在深度学习概念了。麦肯锡全球研究院发文简要回顾了深度学习是如何从概念发展为现实,而使之实现关键人物又是谁。 后来,美国麻省理工学院(MIT)马文·明斯基(Marvin Minsky)和西摩·帕普特(SeymourPapert)在其1969年出版书《感知器》中,用数学方法展示了感知器只能进行很基础任务, 他们书还讨论了训练多层神经网络难点。 2012年,辛顿和他学生在著名 ImageNet 竞赛中取得了突出结果,彰显了深度学习强大。该竞赛以李飞飞等人整理数据集为基础。 深度学习也增强了强化学习这一已存在领域,理查德·萨顿(Richard Sutton)就是其中一位顶尖研究人员,他牵头让谷歌DeepMind开发系统取得了多次棋类比赛胜利。

    84620发布于 2018-07-26
  • 来自专栏别明天就今天吧

    面向对象设计原则-开闭原则

    Open-Closed Principle,"开闭原则"百科上是这么说:一个软件实体(如类、模块、函数)应该对扩展开放,对修改关闭。 为什么? 开闭原则是面向对象设计原则中最基础原则,可称之为原则原则,也可以说是原则指导思想,它强调是既稳定又灵活,在不修改源代码情况下又增加了新功能,核心思想是面向抽象编程。 "开闭原则是抽象类,其他五大原则是具体实现类。"对测试影响,可以提高复用性,提高可维护性,面向对象开发要求。 怎么用? (来说说抽象,抽象是对一组事物通用描述,它没有具体实现,也就表示它有很多可能性,在程序语言中抽象表现为在接口或抽象类定义一些可变行为,并且能够实现对扩展开放,其包含三层含义: 第一,通过接口或抽象类约束扩展 最后再说说封装变化,包含两层含义: 将相同变化封装到一个接口或抽象类中; 将不同变化封装到不同接口或抽象类中;

    70940发布于 2020-09-08
  • 来自专栏web前端教室

    先行者成员提问--JavaScript缩进

    今天在群里有个同学问,说他给github上一个项目写了个插件,然后对方说他插件空格缩进不对,他就想问问几个空格缩进才对? 先说下我观点,我是4个空格,并且我直接就是tab键排齐就完事了。 另外JS本身也确实没有一个真正官方代码风格指南,没有官方文档,然后各个社区也没有共识。 但真要是用2个空格来缩进,这代码确实有点难看,看这个angular.js,这个网上找来看看 ? 这事也分二面说,如果你是给别人写插件,那相当于你加入别人项目,自然要按着别人规矩来。别人是4空格,你写JS就必须是4空格。。 所以这事说到最后吧,前端就是一个约定大于规范地方,就没有一个最权威规范。所以一般就是开工之前,大家坐在一起,约定一下。目前最适合吧,就是一个tab缩进,相当于4个空格。

    58660发布于 2018-02-06
  • 来自专栏机器人网

    “机器换人”先行困惑与隐忧

    本月底,华南地区规模最大制造业展会深圳机械展将着力聚焦机器人。可以预见是,近两年风靡珠三角机器人今年将延续之前热度在珠三角发酵。 诚然,若没有需求,就不能催生产业发展空间,珠三角庞大制造型企业对“机器代人”强烈渴求成为机器人产业发展助力器。 在珠三角很多生产车间里,或出于替代人工未雨绸缪,或出于先行试吃气魄,机器人已渐替代人工。 成本收益 喜:有企业两年投入2.7亿,年均节省人力成本1.8亿 机器人应用这笔账怎么算? 而经过一番“机器换人”之后,该企业工人数量从最高峰时6000人降至目前2000人左右,而每年销量却比往年高出不少。“最开始投入是有点大,但现在看来是值得。”该负责人说。 忧:暂无回报,还处于观察阶段 很多大型企业作为工业机器人试吃先行者,数年经营投入已稍有成效,但对于一些发展中小型企业来说,引进机器人则是一个更加艰巨行为,其成本收益情况也同样不明朗。

    71150发布于 2018-04-13
  • 来自专栏别明天就今天吧

    面向对象设计原则-依赖倒置原则

    Dependence Inversion Principle,DIP"依赖倒置原则",依赖倒置原始定义是: Hign level modules should not depend ; 高层模块依赖抽象层:高层模块基于抽象层编程; 低层模块依赖抽象层:低层模块继承或者实现抽象层; 细节:实现接口或者继承抽象类而产生类; 模块间依赖通过抽象发生 ,实现类之间不发生直接依赖关系,其依赖关系是通过接口或者抽象类产生;接口或者抽象类不依赖于实现类;实现类依赖接口或者抽象类,核心思想是面向接口编程; 采用依赖倒置原则可以减少类之间耦合性, 提高系统稳定性; 举个例子: ? 最佳实践 依赖倒置原则本质就是通过抽象(接口或抽象类)使各个类或模块彼此独立,不互相影响,实现模块间松耦合,我们在项目中应该尽量做到: 1.每个类尽量都有接口或者抽象类,或者抽象类和接口两者都具备

    90010发布于 2020-09-07
  • 来自专栏别明天就今天吧

    面向对象设计原则-里氏替换原则

    "里氏替换原则"是类设计原则之一,我们使用"3H"学习法对其进行拆解; why(目的):为什么要学习"里式替换原则",我们都知道面向对象三大特性:封装、继承、多态,该原则就是对良好"继承关系 接下来我们开始进行具体学习; 概念:LSP,"里式替换原则",凡是在父类出现场景中,将父类替换为子类,程序逻辑不变,反之则未必可以。 1.子类需要实现父类抽象方法 2.子类尽量不要重写或覆盖父类中已经实现方法 3.子类重载父类方法时,子类输入参数>=父类输入参数&子类输出参数<=父类输出参数 4.子类可以添加自己特有的新方法,原则上不建议 LSP经典例子:正方形和长方形不符合里式替换,设置宽、高后,长方形体积=宽*高,正方形体积=高*高,子类无法替换父类,不符合里氏替换原则; 在策略模式中,客户端类依赖抽象父类,场景类使用时传入具体策略子类 ,子类都实现了父类抽象接口,可以互换,这就符合里式替换原则

    1.1K30发布于 2020-09-08
  • 来自专栏猫头虎博客专区

    JAVA 编程中SOLID设计原则:SRP,单一职责原则 OCP,开闭原则 LSP,里氏替换原则 ISP,接口隔离原则 DIP,依赖倒置原则

    而一个遵循着好开发规范以及拥有着良好设计原则系统,往往可以节约大量后期维护升级成本。说起设计,往往大家第一反应是设计模式,殊不知,二十几种设计其实都遵循着一些基本设计原则。 S.O.L.I.D,是事实证明良好设计原则。 如果不遵循该原则,直接大刀阔斧地修改了某对象行为,而恰巧该对象被系统其他部分依赖怎么办? 值得说明一点是,该原则接口并不特指 Java 中 interface ,而是类似于 API 中 I一样泛义接口,抽象类甚至具体实现类都可能包含在这个概念中。 遵循良好设计原则,有利于我们平常在开发中写出更可维护代码,便于团队协作也有利于后来者。道理上讲,设计模式、设计原则等等,也理应成为OOP程序员之间常用术语,这样一来,才能显得更具专业性。

    29010编辑于 2024-04-08
  • 来自专栏别明天就今天吧

    面向对象设计原则-单一职责原则

    Single Responsibility Principle SRP,"单一职责原则":一个类只负责一组相关事情,对应到代码中就是:一个类有多个方法,这些方法时相关。 对于接口一定要做到单一职责原则: ? ? ? ? 对于类来说,尽量做到单一职责原则,一个多职责类可以通过拆分、抽象、组合来实现单一职责原则。 ? ? ? ? ? ? 单一职责原则只适合那些基础类,而不适合基于基础类构件复杂聚合类,在"办公一体机"中,"打印机"、"复印机"、"扫描仪"、"传真机"都是基础类,每个类承担一个职责,而办公一体机是"聚合类",同事具备四种功能 单一职责原则优点: 1.职责减少,类复杂性降低,职责明确; 2.可读性提高,复杂性降低; 3.可维护性提高; 4.一个接口修改只对相应实现类有影响,对其他接口无影响; 原则虽好,但是还要掌握一个度吧 ,不要过渡设计,原则帮助我们写出更优雅、更具有扩展性、松耦合代码设计,根据具体情况而定,要灵活运用;

    88110发布于 2020-09-07
  • 来自专栏别明天就今天吧

    面向对象设计原则-迪米特原则

    Least Knowledge Principle LKP,"迪米特原则":一个对象应该对其他对象有最少了解。 通俗说就是,一个类应该对自己需要耦合或调用类知道最少,你(被耦合或调用类)内部是如何复杂和我没关系,我就知道你提供这么多public方法,我就调用这么多方法,其他我一概不关心。 迪米特原则核心就是解耦合,它对类低耦合提出一些要求: 只和朋友交流。 朋友定义:出现在成员变量、方法输入输出中类称为朋友类,而出现在方法体内部类不属于朋友类。 ? ? ? ? 以上代码中,Teacher类与入参GroupLeader为朋友关系,但是与方法中Girl也有了交流,破坏了Teacher类健壮性,方法时类一个行为,类竟然不知道自己行为与其他类产生关联,违反了迪米特原则 2.朋友间是有距离

    55710发布于 2020-09-07
  • 来自专栏宇宙之_一粟

    资源死锁发生条件

    每个资源要么已经分配给了一个进程,要么就是可用。 2)占有和等待条件。已经得到了某个资源进程可以再请求新资源。 3)不可抢占条件。 已经分配给一个进程资源不能强制性地被抢占,它只能被占有它进程显式地释放。 4)环路等待条件。 死锁发生时,系统中一定有由两个或两个以上进程组成一条环路,该环路中每个进程都在等待着下一个进程所占有的资源。 死锁发生时,以上四个条件一定是同时满足。 如果其中任何一个条件不成立,死锁就不会发生

    63121发布于 2020-10-26
  • 来自专栏日知录

    软件交付原则

    摘自Jez Humble David Farley《持续交付:发布可靠软件系统方法》 为软件发布创建一个可重复且可靠过程 这个原则是我们写这本书一个目标:让软件发布成为一件非常容易事情。 事实上,它的确应该是件很容易事,因为在发布之前,对发布流程中每一个环节,你都已经测试过数百次了。它就应该像单击一个按钮那么容易。 这种可重复性和可靠性来自于以下两个原则: 几乎将所有事情自动化; 将构建、部署、测试和发布软件所需东西全部纳入到版本控制管理之中。 归根结底,软件部署包括三件事: 提供并管理你软件所需要运行环境,这包括硬件配置、所依赖软件、基础设施以及所需外部服务; 将你应用程序正确版本安装在其之上; 配置你应用程序,包括它所需要任何数据以及状态 将几乎所有事情自动化 把所有的东西都纳入版本控制 提前并频繁地做让你感到痛苦事 内建质量 “DONE”意味着“已发布” 交付过程是每个成员责任 持续改进

    73720发布于 2020-09-17
  • 来自专栏就业 C++ 综合学习

    【Linux】 进程信号发生

    信号产生时异步:对于一个进程不知道什么时候会收到信号,他只能先做自己事情,信号产生时也不知道进程在干什么,所以是异步!!! 是对应6号信号(终止会打印Aborted!)其特殊性质是可以被捕捉,但是进程还是会被终止掉,就是为了防止发生所有信号都被捕捉,没有信号可以终止情况,9号信号和19号信号不能被自定义捕捉!!! alarm本质是通过时间戳来比对,在设置闹钟那一刻,操作系统会获取当前时间戳,然后加上闹钟时间得到一个新时间戳。在以后运行中不断和系统时间戳进行比对,相等时候是就是闹钟结束时刻!!! 段错误也是硬件问题,空指针无法通过页表(实际上是MMU内存管理模块进行操作)映射到物理地址,会发生错误! CR2 - 控制寄存器2: 用于存储导致页错误线性地址,当发生页错误异常时,CPU会自动将出错线性地址加载到CR2中。

    35510编辑于 2024-06-17
领券