搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库

14.4死锁

Java大数据智能开发 2018-12-30
举报

死锁

一、死锁

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

二、死锁的例子

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

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死锁》的版权归原作者「Java大数据智能开发」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注Java大数据智能开发微信公众号

Java大数据智能开发微信公众号:SJLS-DJM

Java大数据智能开发

手机扫描上方二维码即可关注Java大数据智能开发微信公众号

Java大数据智能开发最新文章

精品公众号随机推荐

举报