避免活跃性危险(第十章)

避免活跃性危险

在安全性与活跃性之间通常存在着某种制衡,我们使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致“锁顺序死锁”。同样,我们使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁。

1. 死锁

  • 锁顺序死锁:两个线程试图以不同的顺序来获得相同的锁,如果按照相同的顺序来请求锁,那么就不会出现循环的加锁依赖性,因此也就不会产生死锁。
    在制定锁的顺序时,可以使用System.identityHashCode方法,该方法返回有Object.hashCode返回的值,通过比较大小等方法定义锁的顺序。在某些情况下,两个对象可能拥有相同的散列值,此时必须通过某种方法来决定锁的顺序,而这可能会重新引入死锁,为了避免这种情况,可以使用“加时赛”锁,在获得两个对象的锁之前,首先获得这个加时赛锁,从而保证每次只有一个线程以未知的顺序获得这两个锁。
  • 在协作对象之间发生的死锁
    如果在持有锁的情况下调用某个外部方法,那么就需要警惕在协作对象之间发生死锁。
    如果在持有锁时调用某个外部方法,那么将出现活跃性问题,在这个外部方法中可能会获得其他锁(这可能会产生死锁),或者阻塞时间过长,导致其他线程无法及时获得当前被持有的锁。
  • 开放调用
    如果在调用某个方法时不需要持有锁,那么这种调用被称为开放调用。
    在程序中应尽量使用开放调用。与那些在持有锁时调用外部方法的程序相比,更易于对依赖于开放调用的程序进行死锁分析。
  • 资源死锁
  • 线程饥饿死锁。如果某些任务需要等待其他任务的结果,那么这些任务往往是产生线程饥饿死锁的主要来源。
  • 有界线程池/资源池与相互依赖的任务不能一起使用

2. 死锁的避免与诊断

  1. 如果一个程序每次至多只能获得一个锁,那么就不会产生锁顺序死锁。
  2. 如果必须获取多个锁,那么在设计时必须考虑锁的顺序:尽量减少潜在的加锁交互数量,将获取锁时需要遵循的协议写入正式文档并始终遵循这些协议。
  3. 在使用细粒度锁的程序中,可以通过使用一种两阶段策略来检查代码中的死锁:首先,找出在什么地方将获取多个锁,然后对所有这些实例进行全局分析,从而确保它们在整个程序中获取锁的顺序都保持一致。
  4. 使用显示锁Lock类中的定时tryLock功能,在等待超过指定时间后tryLock会放回一个失败信息。

3. 其他活跃性危险

  1. 饥饿:当线程由于无法访问它所需要的资源而不能继续执行时,就发生了“饥饿”。

    引发饥饿的最常见资源就是CPU时钟周期,如果在Java应用程序中对线程的优先级使用不当,或者在持有锁时执行一些无法结束的结构(例如无限循环,或者无限制地等待某个资源),那么也可能导致饥饿,因为其他需要这个锁的线程将无法得到它。线程优先级并不是一种直观的机制,而通过修改线程优先级所带来的效果通常也不明显。当提高某个线程的优先级时,可能不会起到任何作用,或者也可能使得某个线程的调度优先级高于其他线程,从而导致饥饿。

    通常,我们尽量不要改变线程的优先级。只要改变了线程的优先级,程序的行为就将与平台相关,并且会导致发生饥饿问题的风险。
    Thread.yield以及Thread.sleep的语义都是UB,JVM既可以将他们实现为空操作,也可以将它们视为线程调度的参考。
    
  2. 活锁(Livelock)

活锁是另一种形式的活跃性问题,该问题不会导致线程阻塞,但也不能继续执行。因为线程将不断重复执行相同的操作,而且总会失败
活锁通常发生在处理事务消息的应用程序中:如果不能成功处理某个消息,那么消息处理机制将回滚整个事务,并将它重新放到队列的开头。当多个相互协作的线程都对彼此进行响应从而修改各自的状态,并使得任何一个线程无法继续执行时,就发生了活锁,在并发应用程序中,通过等待随机长度的时间和回退可以有效避免活锁的发生。

时间: 2024-09-19 14:04:31

避免活跃性危险(第十章)的相关文章

《Java线程与并发编程实践》—— 2.3 谨防活跃性问题

2.3 谨防活跃性问题 活跃性这个词代表着某件正确的事情最终会发生.活跃性失败发生在应用程序触及一种无法继续执行的状态.在单线程的应用程序中,无限循环就是一个例子.多线程应用程序面临着诸如死锁.活锁和饿死的额外挑战. 死锁:线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源.两条线程都无法继续执行. 活锁:线程x持续重试一个总是失败的操作,以致于无法继续执行. 饿死:线程x一直被(调度器)延迟访问其赖以执行的资源.或许是调度器先于低优先级的线程执行高优先级的线程,而总是有一个高

营销视角:O2O的导购模式让城市消费更具活跃性

中介交易 SEO诊断 淘宝客 云主机 技术大厅 近日笔者看了一则南都周刊对万达集团王健林先生的一篇人物专访,尽管里面绝大部分内容已经遗忘得七七八八,唯独记住了王先生所说的那句"现在很多O2O案例并非真正成功的案例,大部分也只是一种导购模式--" 诚然,王先生所说的不无道理,现在很多O2O商业模式的确只是扮演一种导购角色,充其量就是线下商家的一个网络代理商而已,但如果这种导购模式可以为消费者带来消费的便利,为线下商家带来新的盈利增长点,那么何尝不是成功的营销案例呢? 或许王先生不看好这种

围观2016年最活跃的“顶级Exploit Kit”

Exploit Kit作为传播犯罪软件的重要工具,一直深受网络犯罪分子喜爱.俗话说知己知彼百战百胜,面对与时俱进,不断升级更新的Exploit Kit,我们必须要完全的了解和分析他们,才能实现有效的防御.本文将介绍当下最活跃的流行工具包--Angler,RIG和Neutrino. 什么是Exploit Kit? 预打包了安装程序.控制面板.恶意代码以及相当数量的攻击工具.通常基于PHP的一个软件. Exploit Kit经济体制 价格在成百上千美元: 可以按日/周/月来付租金: 提供可以躲避审查

交易活跃盘子大PVC有望成期市新蓝筹

"PVC价格本身具备频繁波动的周期性特征,且容易受到煤炭和原油价格起伏不定的影响,从而能够保持良好的活跃性,后市潜力不可小看".25日PVC期货在大商所平稳上市,多位业内人士在接受中国证券报记者采访时认为,由于现货市场基础良好,且活跃程度较高,因此,PVC有望成为期货市场的"新蓝筹". 企业避险添"帮手" "参与PVC期货交易,将使得公司销售渠道由原先单一的现货市场格局,转入现货和期货'两条腿'走路的模式,提高公司抵御市场风险和防范周期

毛泽东:论持久战

毛泽东:论持久战     延安时期,是毛泽东思想在多方面得到发展和系统总结,不断走向成熟的时期.毛泽东在延安窑洞中勤奋思考,著书立说,笔耕不辍,写作大量文章,其中就包括1938年5月26日至6月3日毛泽东在延安抗日战争研究会发表的著名讲演<论持久战>. (一九三八年五月)     问题的提起   (一)伟大抗日战争的一周年纪念,七月七日,快要到了.全民族的力量团结起来,坚持抗战,坚持统一战线,同敌人作英勇的战争,快一年了.这个战争,在东方历史上是空前的,在世界历史上也将是伟大的,全世界人民都关

用机器学习的经验指导人生:如何实现学习效率最大化

我们都喜欢狗狗的照片,它们让我们想起那些与这些这些四条腿的小伙伴们一起玩耍度过的清晨. 我们可以很容易的在照片中认出狗狗,因为我们已经看过千百次它们长什么样子. 可是如果一个外星人因为好奇狗狗长什么样而绑架你,你会怎么办?他强迫你教他如何识别狗狗,这样他就可以绑架一只带回他的星球. 请记住,他完全不知道狗狗长什么样.你要怎么做? 你可能需要告诉交给他一些"规则":狗狗有四条腿,两只眼睛,两只耳朵-可是,这可能没有想象的那么容易,因为有很多很多的规则.试想一下,你要怎么教会他区别狗狗和狼

美进行首次模拟黑客攻击人脑实验

近日美国科学家进行了首次模拟电脑黑客攻击人类大脑的实验.实验不仅引起了FBI的注意,并且一些特殊的电脑网络案件也使网络安全专家担心万分.研究人员已经研发出新技术,使得利用思想操控电脑.轮椅甚至于使用Twitter成为一种可能.科学家表示,随着神经系统装置变得越来越复杂--无线成为一种趋势--黑客入侵人脑的威胁应得到足够重视. 装置越复杂越有漏洞 黑客无时无刻不在秘密入侵个人电脑,如果他们将恶毒的攻击矛头指向神经装置--例如当前用于治疗帕金森氏症和抑郁症的深层大脑刺激器或者用于控制假肢的电极系统-

神经网络和机器学习基础入门分享

         最近在做知识图谱实体对齐和属性对齐中,简单用了下Word2vec谷歌开源代码.Word2vec是一个将单词表征成向量的形式,它可以把文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度.         Word2vec采用CBOW(Continuous Bag-Of-Words Model,连续词袋模型)和Skip-Gram(Continuous Skip-GramModel)两种模型,涉及到神经网络和深度学习的一些知识.故这周给学弟和

oracle v$sysstat性能视图

V$SYSSTAT中包含多个统计项,这部分介绍了一些关键的v$sysstat统计项,在调优方面相当有用.下列按字母先后排序: 数据库使用状态的一些关键指标:         CPU used by this session:所有session的cpu占用量,不包括后台进程.这项统计的单位是百分之x秒.完全调用一次不超过10ms         db block changes:那部分造成SGA中数据块变化的insert,update或delete操作数 这项统计可以大概看出整体数据库状态.在各项