死锁:
1)不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。
2)出现死锁后,不会出现异常,不会出现提示,只是所有的线程都出于阻塞状态,无法继续。
产生死锁的四个必要条件:
1)互斥条件:一个资源每次只能被一个进程使用。
2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
处理死锁的四种方法:
1)预防死锁
2)避免死锁
3)检测死锁
4)解除死锁
解决方法:
1)专门的算法、原则
2)尽量减少同步资源的定义
3)尽量避免嵌套同步
我们使用的同时要避免出现死锁:
//死锁演示
class A{
public synchronized void foo(B b){//同步监视器:A类的对象:a
System.out.println("当前线程名:"+Thread.currentThread().getName()+"进入了A实例的foo方法");//1
try{
Thread.sleep(200);
}catch(InterruptedException ex){
ex.printStackTrace();
}
System.out.println("当前线程名:"+Thread.currentThread().getName()+"企图调用A实例的last方法");//3
b.last();
}
public synchronized void last(){System.out.println("进入了A类的last方法内部"