14.4死锁

Posted Java大数据智能开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14.4死锁相关的知识,希望对你有一定的参考价值。

死锁

一、死锁

同步有可能会导致另一个问题,就是死锁。死锁是指两个线程,都相互等待对方释放,死锁有时是不可测知或避开的,我们应该应采取措施避免死锁的出现。

二、死锁的例子

当然,这是一个反面例子。

1、定义一个资源类,为了标识每个资源,该类只有一个属性,就是资源名称。代码如下:

public class Resource {

private String Name;

public String getName() {
return Name;
}

public void setName(String name) {
Name = name;
}
}

2、定义一个资源使用类,该类将会使用到两个资源对象,都是先锁住第一个时,然后在企图锁定另外一个。代码如下:

public class ResourceThread extends Thread{

private String threadName;//线程名称

private Resource rs1;
private Resource rs2;

public ResourceThread(String threadName,Resource rs1,Resource rs2){

this.threadName=threadName;
this.rs1=rs1;
this.rs2=rs2;

}

public void run(){

//
System.out.println(threadName+'企图占有'+rs1.getName());
synchronized (rs1) {
System.out.println(threadName+'已经锁定了'+rs1.getName());

try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(threadName+'企图占有'+rs2.getName());
synchronized (rs2) {
System.out.println(threadName+'已经锁定了'+rs2.getName());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
System.out.println(threadName+'释放'+rs2.getName());

}
System.out.println(threadName+'释放'+rs1.getName());

}

}

3、模拟,现在只有三个资源对象,三个线程对象,

线程一锁住资源一,其他占用资源二;

线程二锁住资源二,其他占用资源三;

线程三锁住资源三,其他占用资源一;

示意图如下:

14.4死锁

代码实现如下:

public class Run {

public static void main(String[] args) {

Resource resource1=new Resource();
resource1.setName('资源一');

Resource resource2=new Resource();
resource2.setName('资源二');

Resource resource3=new Resource();
resource3.setName('资源三');

ResourceThread thread1=new ResourceThread('线程一', resource1, resource2);
ResourceThread thread2=new ResourceThread('线程二', resource2, resource3);
ResourceThread thread3=new ResourceThread('线程三', resource3, resource1);

thread1.start();
thread2.start();
thread3.start();

}

}

结果是哪一个线程都不能正常结束,程序也就一直耗着。你也只能终止这个程序了。


         学习资料          

(输入以下关键字可以获得相关学习资料)

丨Java学习资料1 丨Java学习资料2 丨Java学习资料3 丨

丨大数据资料1丨大数据资料2丨大数据资料3丨

丨Python资料1丨Python资料2丨小程序丨

丨Web前端资料1丨Web前端资料2丨Java架构师丨

丨编程软件合集丨编程软件合集2丨Linux资料丨

丨Java面试集锦丨C语言资料丨


<  END  >


小编微信

如果喜欢小编可以点击关注“Java大数据智能开发”并 加小编  微信:Mrsongww,回复“关键字”获取学习资料,还有更多学习资料分享~让我们一起学习it,走向巅峰!!知识只有共享才能传播,才能推崇出新的知识,才能学到更多,这里写的每一篇文字/博客,基本都是从网上查询了一下资料然后记录下来,也有些是原滋原味搬了过来,也有时加了一些自己的想法~~



14.4死锁



      



点击阅读原文,交个朋友,一起进步吧!

不是Java程序员也没关系,帮忙发给更多朋友!谢谢。



以上是关于14.4死锁的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14.4:苹果进一步封杀非原装配件!

iOS 14.4:苹果进一步封杀非原装配件!

Java并发编程实战 04死锁了怎么办?

Java并发编程实战 04死锁了怎么办?

Unbuntu 14.4Tab键不能自动补全

iOS 14.4更新全家桶发布 你升级了吗?