学分高考 教育头条

深圳口碑前几的Java开发培训机构名单汇总

发布时间: 2022-07-29 00:32:12

千锋教育-中国IT职业教育良心品牌。千锋依托深厚的教学教研实力、完善的就业服务体系,为学员打造品质教学,助力每位学员成为技术过硬的人才。千锋Java培训十年沉淀,全力培养Java软件开发工程师。

0元教程资源,普惠万千学子

0元领取全套视频教程、深度技术解析、课程配套代码、学习笔记、学习路线图等

匠心巨制,IT技术讲师带你从0开始学开发

千锋携手高校和IT技术讲师共同编著,由浅入深打造学员技术根基,面向就业让学员在实战中建立自己的知识体系。

深度合作IT企业,打造Java企业直聘班

千锋独有的“技术合作中台”引进Java培训企业项目和技术,打磨学员实战技战,匹配企业人才需求

深圳口碑前几的Java开发培训机构名单汇总

如何避免死锁?

死锁的原因就是两个线程试图以不同的顺序来获得相同的锁。所以,如果所有的线程以固定的顺序来获得锁,那么在程序中就不会出现锁顺序死锁的问题。

(1)动态的锁顺序死锁

以一个经典的转账案例来进行说明,我们知道转账就是将资金从一个账户转入另一个账户。在开始转账之前,首先需要获得这两个账户对象得锁,以确保通过原子方式来更新两个账户中的余额,同时又不破坏一些不变形条件,例如 账户的余额不能为负数。

结论:由于我们无法控制transferMoney中的参数的顺序,而这些参数顺序取决于外部的输入。所以两个线程同时调用transferMoney,一个线程从X向Y转账,另一个线程从Y向X转账,那么就会发生互相等待锁的情况,导致死锁。

解决问题方案:定义锁的顺序,并且整个应用中都按照这个顺序来获取锁。

方案一:使用System.identityHashCode方法,该方法返回有Object.hashCode返回的值,此时可以通过某种任意方法来决定锁的顺序。但是在极少数情况下,两个对象可能拥有相同的散列值,在这种情况下,通过给公共变量加锁来实现给锁制定顺序。所以这种方法也是用较小的代价,换来了较大的安全性。

方案二:在Account中包含一个的,不可变的,值。比如说账号等。通过对这个值对对象进行排序。

(2)在协作对象之间发生的死锁

如果在持有锁时调用某外部的方法,那么将出现活跃性问题。在这个外部方法中可能会获取其他的锁(这个可能产生死锁),或阻塞时间过长,导致其他线程无法及时获得当前持有的锁。

场景如下:Taxi代表出租车对象,包含当前位置和目的地。Dispatcher代表车队。当一个线程收到GPS更新事件时掉用setLocation,那么它首先更新出租车的位置,然后判断它是否到达目的地。如果已经到达,它会通知Dispatcher:它需要一个新的目的地。因为setLocation和notifyAvailable都是同步方法,因此掉用setLocation线程首先获取taxi的锁,然后在获取Dispatcher的锁。同样,掉用getImage的线程首先获取Dispatcher的锁,再获取每一个taxi的锁,这两个线程按照不同的顺序来获取锁,因此可能导致死锁。

解决方案:使用开放掉用。如果再调用某个方法时不需要持有锁,那么这种调用就被称为开放掉用。这种调用能有效的避免死锁,并且易于分析线程安全。

温馨提示:
本文【深圳口碑前几的Java开发培训机构名单汇总】由作者教培参考提供。该文观点仅代表作者本人,学分高考系信息发布平台,仅提供信息存储空间服务,若存在侵权问题,请及时联系管理员或作者进行删除。
我们采用的作品包括内容和图片部分来源于网络用户投稿,我们不确定投稿用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的权利,请联系我站将及时删除。
内容侵权、违法和不良信息举报
Copyright @ 2024 学分高考 All Rights Reserved 版权所有. 湘ICP备17021685号