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、模拟,现在只有三个资源对象,三个线程对象,
线程一锁住资源一,其他占用资源二;
线程二锁住资源二,其他占用资源三;
线程三锁住资源三,其他占用资源一;
示意图如下:
代码实现如下:
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,走向巅峰!!知识只有共享才能传播,才能推崇出新的知识,才能学到更多,这里写的每一篇文字/博客,基本都是从网上查询了一下资料然后记录下来,也有些是原滋原味搬了过来,也有时加了一些自己的想法~~
点击阅读原文,交个朋友,一起进步吧!
不是Java程序员也没关系,帮忙转发给更多朋友!谢谢。
以上是关于14.4死锁的主要内容,如果未能解决你的问题,请参考以下文章