1. 死锁概述
死锁是一种并发锁定的特殊状态,指的是,当具有多个共享资源时 一部分线程持有一部分资源的锁 要求另外的线程持有的另外的资源的锁 形成了各自持有各自的锁而要求对方的锁的状态 这样 进入了一个互相等待的状态 都无法继续执行 则称之为产生了死锁
死锁并不是一种真正的锁,而是一种特殊状态,会造成程序无法继续运行或退出,所以要尽力的解决死锁
案例:
package cn.tedu.thread;
/**
* 死锁
*/
class DYJ{}
class SMY{}
public class Demo01 {
public static DYJ dyj = new DYJ();
public static SMY smy = new SMY();
public static void main(String[] args) {
new Thread(new T01_A()).start();
new Thread(new T01_B()).start();
}
}
class T01_B implements Runnable{
@Override
public void run() {
try{
synchronized (Demo01.smy) {
System.out.println("B使用扫描仪"+Demo01.smy);
Thread.sleep(3000);
synchronized (Demo01.dyj) {
System.out.println("B使用打印机"+Demo01.dyj);
Thread.sleep(2000);
}
}
}catch( Exception e){
e.printStackTrace();
}
}
}
class T01_A implements Runnable{
@Override
public void run() {
try {
synchronized (Demo01.dyj) {
System.out.println("A使用打印机"+Demo01.dyj);
Thread.sleep(3000);
synchronized (Demo01.smy) {
System.out.println("A使用扫描仪"+Demo01.smy);
Thread.sleep(2000);
}
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2. 死锁产生的条件
a. 多把锁
b. 多个线程
c. 同步嵌套
在Synchronized代码块中再包含Synchronized代码块,这就意味着,占用着一部分锁,再要求另一部分锁
3. 解决死锁
避免死锁
避免同步嵌套来避免死锁的产生
检测并打断死锁
有时无法进行避免死锁的操作,此时只能不停的检测是否有死锁产生,如果有死锁产生,则打断死锁,所谓的打断死锁,就是将造成死锁的某一线程错误退出,打断对锁互相要求的环,从而使程序可以正常运行下去。