浏览以下内容前,请点击并阅读 声明

  一个并发程序以适时方式执行的能力叫活性。以下部分介绍最常见的一种活性问题,死锁,并简单介绍其他两种活性问题,饥饿和活锁。

死锁

  死锁描述了一种情况:两个或两个以上的线程都被永久封堵,而他们还在相互等待对方释放一个对象的锁。

public class DeadLock {
//嵌套类
static class Friend {
private String name;
public Friend(String name) {
this.name = name;
}
//注意以下两个方法均为同步方法,运行该方法都要请求对应对象的锁
public synchronized String getName() {
return this.name;
}
public synchronized void introduce(Friend he) {
System.out.format( "I'm "+"%s%n", this.name);
System.out.format( "And she is "+"%s%n", he.getName());
}
}
public static void main(String[] args) {
final Friend alphonse = new Friend("Alphonse");
final Friend gaston = new Friend("Gaston");
//使用匿名类创建两个线程,并启动线程
new Thread(new Runnable() {
public void run() { alphonse.introduce(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.introduce(alphonse); }
}).start();
}
}

  运行以上代码,很有可能就会产生死锁,程序无法结束运行,因为两个线程可能同时拥有一个对象的锁(同步方法造成的),同时又想请求对方已拥有的锁,这样就会造成死锁。

  打个比方,甲乙两个人同时想往木板上钉钉子,而工具只有一把锤子和一盒钉子,甲先拿到了锤子,而乙则抢到了钉子,这样就陷入了僵局,即死锁。人可能比较会变通,其中任何一个人让一下,谁都能完成工作,而机器不会,他们严格遵守先拿先用的原则,这样就陷入了无休止的死锁当中,当然以上我说的可能产生死锁,是因为其有一定的概率,可能有一个线程先拿到两个对象的锁,并执行完毕,这样就不会产生死锁。

饥饿

  饥饿和活锁较死锁更为少见,但依然是并发软件设计中可能遇到的问题。

  饥饿是指一个线程需要经常请求一个资源而无法得到满足,因而使其进展缓慢的情况。一个共享的对象资源被一个“贪婪”的线程长期占据,比如该共享对象中有一个同步方法需要长时间才能执行完成,而另外一个线程则需要频繁同步访问该共享对象就会被经常堵塞,饥饿就产生了。

活锁

  如果一个线程的动作响应另外一个线程,而另外一个线程的动作也响应该线程,这样就可能会产生活锁。就像死锁一样,活锁导致线程无法继续运行,然而线程并未被封堵,只是忙于相互响应而无法恢复工作,打个比方,甲乙两人迎面要走过一个走廊,甲向左以避开乙,而乙却向右,这样就又堵住了对方的路,甲乙又同时响应对方。。。没错,还是过不去。

最新文章

  1. [原创]自己动手实现React-Native下拉框控件
  2. git学习--常用命令
  3. 谈谈React Native环境安装中我遇到的坑
  4. Paxos算法细节详解(一)--通过现实世界描述算法
  5. 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)
  6. C#带小括号的运算
  7. C语言位运算详解[转]
  8. Echart 商业级数据图表
  9. [wikioi]没有上司的舞会
  10. json-lib 使用教程
  11. 我和小美的撸码日记(2)之第一个基于MVC+Jqgrid的列表页面
  12. 关于vue 框架与后台框架的混合使用的尝试------转载
  13. 微信公众号开发C#系列-1、微信公众平台注册
  14. c/c++ 重载运算符 类型转换运算符
  15. python中使用pillow绘制汉字
  16. 利用OpenLayers创建wkt字符串
  17. DIV+CSS 中的 overflow:hidden
  18. xaf.domain object new 在属性上的用法
  19. 《杜增强讲Unity之Tanks坦克大战》7-坦克血条
  20. iPhone X 的原深感模组

热门文章

  1. D3.js学习(一)
  2. 微信小程序与传统APP十大优劣对比
  3. 答辩HTML5
  4. 《C程序设计语言》- 字符输入和输出
  5. Xcode的一个简单的UITests
  6. 使用Dir,遍历文件夹下所有子文件夹及文件
  7. Servlet技术(使用myeclipse)
  8. Web项目使用Oracle.DataAccess.dll 类库连接oracle数据库
  9. samba共享目录
  10. Oracle10g 表分区