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

    Java先行发生原则

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

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

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

    先行发生”(happens-before)原则。 一、什么是先行发生原则 现在就来看看“先行发生原则指的是什么。 4. 线程启动规则(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
  • 来自专栏EAWorld

    Kubernetes设计4原则

    引言: 今天我要带给大家是2018年底,在西雅图举办Kubecon一场分享,来自谷歌K8s团队工程师Saad Ali分享《Kubernetes设计原则》。 这就引入了Kubernetes第三个设计原则: 满足用户需求 ( Meet the user where they are ) 原则3. 于是这就引入了kubernetes设计第四个原则: 可移植工作负载 ( Workload portability ) 原则4. ,K8s背后设计原则原因,其实它软件设计一些一般性原则是一致,虽然面向对象已经不在是什么流行术语,但是本文中设计原则和面向对象设计原则高度一致。 希望本文分享能帮助你理解K8s背后设计原则

    93710发布于 2020-01-17
  • 来自专栏性能与架构

    高效开发4原则

    遵守下面4原则会使我们开发更加踏实、愉悦 ?: 1. 没有测试过代码就是坏代码 对于我们自己和我们开发团队,要不断加强测试意识,形成我们开发文化。 给后期维护带来麻烦,获取用户、登录这两个操作虽然现在是一体需求,但以后很有可能有独立需求,那时是不是还要变动。 4. 例如很多人命名:data、foobar、myNumber、SomethingManager,他们对于程序运行是正确,但会成为团队维护噩梦。 尽量让名字含义精确,并尽可能简短,这样有利于代码维护、代码 review,在 IDE 中可以根据名字快速查找代码。 小结 我们是有追求程序员 ? ,牢记这4点: 没有测试过代码就是坏代码 方法要小 方法应该没有副作用 起名字要有明确含义 内容翻译整理自: https://engineering.videoblocks.com/these-four-clean-code-tips-will-dramatically-improve-your-engineering-teams-productivity-b5bd121dd150

    40020发布于 2019-03-07
  • 来自专栏我和未来有约会

    Silverlight 4 中数据绑定发生变化

    <Button Content="Button"/> </StackPanel> <Slider Minimum=".5" Maximum="<em>4</em>" "1" VerticalAlignment="Top" /> </Grid> ================================= String Formatting 新版Silverlight4 中新增加了格式化字符串能力。 现在可以使用扩展标记StringFormat来做一些比如日期、货币等格式化。 在VS2010中也提供了可视化支持。 支持数据到GroupDescriptions绑定,这样可以更加轻松在XAML做分组。

    1.6K80发布于 2018-01-16
  • 来自专栏国产程序员

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

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

    1.5K40发布于 2020-07-28
  • 来自专栏温安适的blog

    面向对象设计4原则

    OCP(开闭原则) 类应该对扩展开放,对修改而关闭。 应用举例 本人是做彩票业务,就以彩票举例吧。 若这时添加大乐透彩种校验,需要修改OCPDemo中validate代码,加入另外一个else if 分支,这违反了OCP原则,并没有对修改而关闭。 ,也违反DRY原则,系统中会出现大量重复代码。 下面让我们看看SpringJdbcTemplate如何遵循DRY原则。上边模式,有一定套路,Spring总结了套路,封装成了模板,经过Spring封装,只需传入Sql,和结果集合转换类。 违反LSP情形举例 假设我们有一个Graph2D 用于制作2D平面,现在要新创建一个Graph3D类,用于构建立体图,下面我们使用违反LSP原则方式实现。

    70120发布于 2019-03-12
  • 来自专栏防止网络攻击

    输出4种波形函数信号发生

    一、设计要求 1、以MCS-51系列单片机为控制器件,用C语言进行程序开发,结合外围电子电路,设计一款函数信号发生器系统; 2、 能够产生正弦波、方波、三角波和锯齿波4种波形; 3、扩展键盘输入电路,用于切换波形类型 单片机设计函数信号发生器系统,能够产生正弦波、方波、三角波和锯齿波4种波形,且波形频率可调,调节幅度为10~100Hz。 工作原理为:单片机产生数字信号,经DAC0832转换为模拟信号,再通过LM358运算电路放大后,输出4种频率可调波形。 波形类型和频率值由LCD液晶显示,波形切换和频率调节由按键控制。 同时,4个不同色彩LED分别作为不同波形指示灯。 综上所述,函数信号发生器仿真电路运行效果满足设计要求,验证成功。

    50910编辑于 2024-05-14
  • 来自专栏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
  • 来自专栏小樱的经验随笔

    设计模式六大原则4):接口隔离原则

    解决方案:将臃肿接口I拆分为独立几个接口,类A和类C分别与他们需要接口建立依赖关系。也就是采用接口隔离原则。 举例来说明接口隔离原则: ? 类C依赖接口I中方法1、方法4、方法5,类D是对类C依赖实现。 (图2  遵循接口隔离原则设计) 照例贴出程序代码,供不熟悉类图朋友参考: 1 interface I1 { 2 public void method1(); 3 } 4 5 说到这里,很多人会觉接口隔离原则跟之前单一职责原则很相似,其实不然。其一,单一职责原则原注重是职责;而接口隔离原则注重对接口依赖隔离。 使接口用最少方法去完成最多事情。 运用接口隔离原则,一定要适度,接口设计过大或过小都不好。设计接口时候,只有多花些时间去思考和筹划,才能准确地实践这一原则

    99370发布于 2018-04-08
  • 来自专栏互联网杂技

    你必须知道4条设计黄金原则

    房东跟我及合租朋友交流方式简直毫无逻辑。 不过值得高兴是,我们中介公司设计无能让我从中get√到很多值得学习点,我很想跟你分享一下。 原则 1. 原则 2. 划重点 如果你有一个点希望用户能注意到的话,那么通常上我们会做一些小设计去引导用户去注意到那些重要信息。 原则三:社会认同 社会认同(Social Proof):是一种心理和社会现象,人们倾向于认为他人比自己更加了解所处情况,他人行为也总是合理和正确。通俗来讲,就是从众心理,羊头效应。 最后,强调一下抽烟会对其他房客会产生什么样不好影响, 强化这种行为社会不认可性。 原则4:用户界面设计 用户界面设计:是指用户在给定交互中所期望设计模式。 无论何时,当你需要向别人传达某种信息时,时刻记住这几点原则,能够帮你更好地去理解用户习惯与立场。

    68280发布于 2018-04-04
  • 来自专栏小脑斧科技博客

    slf4j 原理及使用原则

    引言 对于服务端运行程序来说,日志是极为重要,无论是日常运行状态监控还是问题发生定位排查,都离不开日志。但在 java 语言中,有着许许多多不同日志框架供我们使用。 3. slf4j 使用三原则 在实际使用中,我们常常会遇到一些问题,例如虽然配置了 slf4j 却没有按照预期以同一个日志框架方式输出日志,日志仍然是出现在了多个地方,或者因为一系列包冲突导致项目无法启动 总结起来,slf4j 使用三个原则就是: 遗留层包必须全部去除,这样才能保证遗留日志都会经过桥接包进入 slf4j-api 桥接层与适配器层同一列包不能共存,否则会死循环导致StackOverFlow 适配器层(包括logback-classic也算适配器层)最多只能选1个包存在,否则slf4j日志有可能输出到非预料位置 4. jul 桥接 slf4j 失败问题 上述 slf4j 使用原则中有一个问题 ,那就是图中 inner-java 对应 java.util.logging 包名下日志框架是定义在 rt.jar 中,我们不能排除这个框架包依赖,而由于双亲委派原则,我们也不能通过类加载机制覆盖这个包中任何类

    1.6K30编辑于 2022-12-21
  • 来自专栏明志德到的IT笔记

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

    现存原则发生改变,新原则会被加进来,旧原则将不再适用。实践和从实践中获得经验,促使我们发展了那些原则原则4 高质量软件是可以实现 尽管我们行业中有一些表现不佳、包含bug,或者根本无法满足客户需求软件系统例子,但仍然有一些成功例子。 与原则185和201 (强调软件部署后,需求可能发生巨大变化)不同,本原则想表达,在开发过程中,软件也可能发生巨大变化。这些变化可能体现在编写新代码、新测试计划或新需求规格说明上。 需要留意是,在硬件例子中,设计成本只有轻微增长; 而在软件例子中,设计成本(这是软件主要成本)会翻倍。软件超高可靠性是非常昂贵(见原则4)。 原则125涉及记录、分析技术错误并从中学习。本原则用于对管理错误或者整体技术错误进行同样操作。在每个项目结束时,给所有的项目关键参与者3~4时间来分析项目中出现每一个问题。

    1.9K20编辑于 2023-10-21
  • 来自专栏学习笔记ol

    小谈设计模式(4)—单一职责原则

    小谈设计模式(4)—单一职责原则 专栏介绍 主要对目前市面上常见23种设计模式进行逐一分析和总结,希望有兴趣小伙伴们可以看一下,会持续更新。 单一职责原则 单一职责原则(Single Responsibility Principle,SRP)是设计模式中一项原则,它指出一个类或模块应该有且只有一个引起它变化原因。 低耦合性 类之间耦合性指的是彼此之间依赖程度。遵守单一职责原则可以降低类之间耦合性,使得类之间依赖关系更加清晰和简单,减少代码依赖和影响范围。 不遵守单一职责原则,可能引发问题 类职责不清晰 一个类负责了多种不相关职责,使得代码难以理解和维护。 总结 总结来说,单一职责原则是设计模式中一项重要原则,它要求将功能划分得更加细致,使得每个类或模块 只负责一种相关职责。遵守单一职责原则可以提高代码可读性、可维护性和可扩展性。

    44110编辑于 2023-10-11
  • 来自专栏人工智能快报

    深度学习起源与先行

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

    86220发布于 2018-07-26
  • 来自专栏业余草

    如果网站 Cookie 超过 4K,会发生什么情况?

    有没有想过,如果网站 Cookie 特别多特别大,会发生什么情况? 那么有趣事就来了 —— Cookie 是可以长期储存,所以只要不过期,对应站点就一直无法访问! 为什么会这样!因为博客园是支持自定义装扮,用户可以嵌入自己脚本。 除了这个主站,能否将其他子站服务也一起破坏呢? 答案是可以!因为 Cookie 具有一个特殊属性 domain,它允许子站设置上级站点 Cookie。甚至可以是根域! 是不是很有趣:)这种局部屏蔽效果,显然有更好迷惑性。 协议 仔细回顾一遍 Cookie 属性,除了 secure,再没和 URL Scheme 相关属性了。 接着悄悄创建目标站点隐藏框架页,中间人返回特定页面内容,其中脚本即可修改目标站点 Cookie 了。 下面就来尝试一下吧。 通过代理,我们模拟流量被劫持场景。

    1.4K40发布于 2020-05-21
领券