为了避免多线程访问共享资源是会加上同步锁,避免安全问题,但是加了同步锁可能导致死锁.
发生死锁的原因:
1, 同步代码块内嵌套了同步代码快
2, 并且他们的锁对象不一样
例如:
class DeadLocker implements Runnable{
private boolean mFlag;
DeadLocker(boolean flag){
mFlag = flag;
}
public void run(){
if(mFlag){
synchronized(LockerObjects.obj1){
System.out.println(Thread.currentThread().getName() + ", run to A");
synchronized(LockerObjects.obj2){
System.out.println(Thread.currentThread().getName() + ", run to A");
}
}
}
else{
synchronized(LockerObjects.obj2){
System.out.println(Thread.currentThread().getName() + ", run to C");
synchronized(LockerObjects.obj1){
System.out.println(Thread.currentThread().getName() + ", run to D");
}
}
}
}
}
class LockerObjects{
public static final Object obj1 = new Object();
public static final Object obj2 = new Object();
}