java死锁的问题

package cn.bdqn.javaspecialday07;
/**
 *时间:2018年5月10日
 *作者:   jillion
 *文件名:DeadLock.java
 *描述:   TODO
 *版本:   V1.0
 */
public class DeadLock {
private Object orange = new Object();

private Object apple = new Object();

//有两个学生,各有一个苹果和橘子,有橘子的同学把自己 的橘子 锁起来 ,不给别人 拿到,但他想拿到别人的苹果,

//同理,有苹果的同学 把自己的苹果锁起来,不给别人拿到,自己却想拿到别人的橘子,这里时候就产生了互斥现象,也叫死锁

public static void main(String[] args) {
DeadLock dl = new DeadLock();
dl.start();
}
public void start(){
ThreadQiu qiu = new ThreadQiu(orange,apple);
ThreadXiao xiao = new ThreadXiao(orange,apple);
qiu.start();
xiao.start();


}


}
class ThreadQiu extends Thread{
private Object orange =null;
private Object apple = null;
ThreadQiu(Object orange,Object apple){
this.apple = apple;
this.orange = orange;
}
@Override
public void run() {
synchronized (orange) {
System.out.println("秋勇的橘子锁住");
synchronized (apple) {
System.out.println("这是晓冬的苹果");
}
}
}


}
class ThreadXiao extends Thread{
private Object orange =null;
private Object apple = null;
ThreadXiao(Object orange,Object apple){
this.apple = apple;
this.orange = orange;
}
@Override
public void run() { 
synchronized (apple) {
System.out.println("晓冬的苹果锁住");
synchronized (orange) {
System.out.println("这是秋勇的橘子");
}
}
}

}

jvm提供了一个诊断工具Thread Dump,使用的dos命令行的方式处理

java死锁的问题

java死锁的问题



如何避免死锁:

(1)    打破互斥条件:允许进程同时访问某些资源,但是,有的资源不允许被同时访问,就像打印机,这是由资源的本身来决定的,所以这个方法并没有什么实用的价值。

(2)    打破不可抢占的条件:就是说允许进程强行从资源的占有者那里抢夺资源。这种方法实现起来很困难,会降低性能。

(3)    打破占有申请条件:可以实现资源预先分配策略,在进程运行前一次性向系统申请他所需要的全部资源。如果进程所需的资源不能满足,则不分配任何资源,进程暂时不运行。(问题:1.在很多时候,一个进程在执行之前不可能知道它所有的全部资源,进程在执行的过程中,是动态的。2.资源利用率低。3.降低进程的并发性,因为资源有效,有加上存在浪费,能分配的所需全部资源的进程个数必然很少。)

(4)    打破循环等待条件:实行资源的有序分配策略,把资源事先分类编号,按号分配,使进程在申请,占用资源时候不能形成环路,所有进程对资源的请求必须严格按照资源号递增的顺序提出,进程占用了小号的资源,才能申请大号资源。就会形成环路。(缺点:限制进程对资源的请求,同时对系统中的所有资源合理编号也是很有困难的,增加额外的系统开销。)