java中如何写一个死锁例子
2016-06-30 21:42
316 查看
如有转载,请申明:
转载至http://blog.csdn.net/qq_35064774/article/details/51793656
你没看错,今天是要写一个死锁程序。通过自己写一个死锁例子,就能理解为什么会发生死锁。
但在写这个程序前,是不是要知道什么情况下才会发生死锁(假装我开头没说过那句话)。我们先抛开一系列复杂的业务逻辑,单纯从语法上来分析。
死锁的定义是,两个或两个以上的线程或进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。
是不是觉得定义比较抽象,我们简化一下,就当成只有两个线程。现在有线程1和线程2。线程1执行过程中,先锁定了对象a,然后需要再锁定b才能继续执行代码;而线程2正巧相反,先锁定了b,需要再锁定a才能继续执行代码。这时,两个线程都等着对方解锁,才能继续执行,这时,两个线程就进入等待状态,最终不会有线程执行。这就变成了死锁。
接下来我们来写代码。
从这个例子很容体会到,只要尽量避免加多个锁,就可以尽量避免死锁。
转载至http://blog.csdn.net/qq_35064774/article/details/51793656
你没看错,今天是要写一个死锁程序。通过自己写一个死锁例子,就能理解为什么会发生死锁。
但在写这个程序前,是不是要知道什么情况下才会发生死锁(假装我开头没说过那句话)。我们先抛开一系列复杂的业务逻辑,单纯从语法上来分析。
死锁的定义是,两个或两个以上的线程或进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。
是不是觉得定义比较抽象,我们简化一下,就当成只有两个线程。现在有线程1和线程2。线程1执行过程中,先锁定了对象a,然后需要再锁定b才能继续执行代码;而线程2正巧相反,先锁定了b,需要再锁定a才能继续执行代码。这时,两个线程都等着对方解锁,才能继续执行,这时,两个线程就进入等待状态,最终不会有线程执行。这就变成了死锁。
接下来我们来写代码。
public class TestThread { public static void main(String[] args) { // test dead lock Thread t9 = new Thread( new DeadLock(true)); Thread t10 = new Thread( new DeadLock(false)); t9.start(); t10.start(); } } class DeadLock implements Runnable{ boolean lockFormer; static Object o1 = new Object(); static Object o2 = new Object(); DeadLock(boolean lockFormer){ this.lockFormer = lockFormer; } @Override public void run() { if(this.lockFormer){ synchronized (o1) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println("1ok"); } } }else{ synchronized (o2) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1) { System.out.println("1ok"); } } } } }
从这个例子很容体会到,只要尽量避免加多个锁,就可以尽量避免死锁。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树