多线程同步为什么会产生死锁?
死锁产生原因:线程1锁住资源A等待资源B,线程2锁住B资源等待A资源,两个线程都在等待自己所需的资源,而这些资源被另外的线程锁住,这些线程你等我,我等你,谁也不愿意让出资源,造成死锁问题,程序停止运行。
举个现实生活中的例子理解死锁:
有两辆汽车,汽车1和汽车2,汽车1后备箱内装着汽车2启动需要的汽油,汽车2后背箱内装着汽车1启动所需的电瓶;但是汽油和电瓶都被锁住了,汽车1和汽车2的车主,都在等待对方打开后背箱的锁把自己所需要的资源给自己,就这样你等我,我等你,两辆汽车就在那停着谁走不了。
避免死锁问题出现的办法:
不要分别同步各个资源的操作代码块,而是统一放在一个同步块中
就是不要把汽油和电瓶分别锁起来,放在同一个箱子里用一把锁锁起来,两个车主都有这把锁的钥匙
死锁问题实例:
/**
* 多线程死锁问题
*/
public class DeadLock implements Runnable {
public boolean flag=true;
private static Object res1=new Object(); //资源1
private static Object res2=new Object(); //资源2
public void run() {
if(flag){
/*锁定资源res1*/
synchronized(res1){
System.out.println("锁住资源1,等待资源2.。。。");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*锁定资源res 2*/
synchronized(res2){
System.out.println("Complete.");
}
}
}else{
/*锁定资源2*/
synchronized(res2){
System.out.println("锁住资源2,等待资源1。。。。。");
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//锁定资源res1
synchronized(res1){
System.out.println("Complete.");
}
}
}
public static void main(String[] args) {
DeadLock r1=new DeadLock(); //创建线程对象
DeadLock r2=new DeadLock();
r2.flag=false;
Thread t1=new Thread(r1); //创建线程
Thread t2=new Thread(r2);
t1.start();
t2.start();
}
}