身为JAVA工作者必须了解的实战知识(九)

一、死锁

所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。百科百科

当两个以上的运算单元,双方都在等待对方停止运行,以取得系统资源,但是没有一方提前退出时,这种状况,就称为死锁。维基百科

1. 顺序死锁

最少有两个锁,一个线程获取到A锁需要获取B锁才能进行操作,而另外一个线程获取到了B锁,需要获取A锁才能执行操作,这种情况下容易出现顺序死锁。

[java]view plaincopy

print?

publicclassLeftRightDeadlock {

privatefinalObject left =newObject();

privatefinalObject right =newObject();

publicvoidleftRight() {

synchronized(left) {

synchronized(right) {

// doSomething();

}

}

}

publicvoidrightLeft() {

synchronized(right) {

synchronized(left) {

// doSomething();

}

}

}

}

2. 动态的锁顺序死锁

[java]view plaincopy

print?

publicvoidtransferMoney(Account fromAccount, Account toAccount, DollarAmount anount)

throwsInsufficientResourcesException {

synchronized(fromAccount) {

synchronized(toAccount) {

if(fromAccount.getBalance().compareTo(amount) <0) {

thrownewInsufficientResourcesException();

}else{

fromAccount.debit(anount);

toAccount.credit(anount);

}

}

}

}

A: transferMoney(myAccount, yourAccount, 10);

B: transferMoney(yourAccount, myAccount, 20);

由外部传入的变量所有锁的条件,但是由以上传入的变量可以看到,这种情况下会出现一个线程先获取myAccount锁在申请yourAccount锁,而另外一个线程相反先获取yourAccount锁在申请myAccount锁。

[java]view plaincopy

print?

privatestaticfinalObject tieLock =newObject();

publicvoidtransferMoney(finalAccount fromAccount,finalAccount toAccount,finalDollarAmount anount)

throwsInsufficientResourcesException {

classHelper{

publicvoidtransfer()throwsInsufficientResourcesException {

if(fromAccount.getBalance().compareTo(amount) <0){

thrownewInsufficientResourcesException();

}else{

fromAccount.debit(anount);

toAccount.credit(anount);

}

}

}

intfromHash = System.identityHashCode(fromAccount);

inttoHash = System.identityHashCode(toAccount);

if(fromHash < toHash){

synchronized(fromAccount){

synchronized(toAccount) {

newHelper().transfer();

}

}

}elseif(fromHash >  toHash){

synchronized(toAccount){

synchronized(fromAccount) {

newHelper().transfer();

}

}

}else{

synchronized(tieLock) {

synchronized(fromAccount) {

synchronized(toAccount) {

newHelper().transfer();

}

}

}

}

}

3. 在协作对象之间发生的死锁

[java]view plaincopy

print?

classTaxi {

privatePoint location, destination;

privatefinalDispatcher dispatcher;

publicTaxi(Dispatcher dispatcher) {

this.dispatcher = dispatcher;

}

publicsynchronizedPoint getLocation(){

returnlocation;

}

publicsynchronizedvoidsetLocation(Point location){

this.location = location;

if(location.equals(destination)){

dispatcher.notifyAvaliable(this);

}

}

}

classDispatcher {

privatefinalSet taxis;

privatefinalSet avaliableTaxis;

publicDispatcher(){

taxis =newHashSet();

avaliableTaxis =newHashSet();

}

publicsynchronizedvoidnotifyAvaliable(Taxi taxi) {

avaliableTaxis.add(taxi);

}

publicsynchronizedImage getImage(){

Image image =newImage();

for(Taxi t :taxis){

image.drawMarker(t.getLocation());

}

returnimage;

}

}

4. 开放调用

-- 待填充

5. 资源死锁

外部锁常被忽视而导致死锁,例如数据库的锁

二、死锁的避免与诊断

1. 支持定时的死锁

存在一些预防死锁的手段,比如Lock的tryLock,JDK 7中引入的Phaser等。

2. 通过线程转储信息来分析死锁

通过Dump线程的StackTrace,例如linux下执行命令 kill -3 ,或者jstack –l ,或者使用Jconsole连接上去查看线程的StackTrace,由此来诊断死锁问题。

三、其他活跃性危险

1. 饥饿

2. 糟糕的响应性

3. 活锁

四、锁的使用

使用支持CAS的数据结构,避免使用锁,如:AtomicXXX、ConcurrentMap、CopyOnWriteList、ConcurrentLinkedQueue

死锁经常是无法完全避免的,鸵鸟策略被很多基础框架所采用。

存在检测死锁的办法

以上就是我推荐给Java开发者们的一面试经典知识。但是这些知识里面并没有太多Java全栈、Java晋阶、JAVA架构之类的题,不是我不推荐,而是希望大家更多的从基本功做起,打好基础,太多复杂的内容一会儿也说不明白。

好了同学们,我能介绍的也都全部介绍完给你们了,如果下获得更多JAVA教学资源,可以选择来我们这里共同交流,群:240448376,很多大神在这里切磋学习,不懂可以直接问,晚上还有大牛免费直播教学。

注:加群要求

1、具有一定工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加,有些应届生和实习生也可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

PS:现在主要讲解的内容是(反射原理枚举原理与应用注解原理常用设计模式、正规表达式高级应用、JAVA操作Office原理详解JAVA图像处理技术,等多个知识点的详解和实战)

6.小号或者小白之类加群一律不给过,谢谢。

最后,每一位读到这里的网友,感谢你们能耐心地看完。觉得对你有帮助可以给个喜欢!希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容