死锁
死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,
因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。
由于这个原因,在使用“synchronized”关键词时,很容易出现两个线程互相等待对方做出某个动作的情形。下面我写了一个死锁的代码(根据老师的写的)
//---------------死锁---------------
//当同步中嵌套同步,就有可能出现死锁的现象
//多线程争夺同一资源(对象锁) 产生的假死现象 -- 死锁
//定义两个对象,当作同步中的锁,保证对象唯一 A B
class LockA {public static final LockA locka=new LockA();}
class LockB{public static final LockB lockb=new LockB();}
class ThreadDemo implements Runnable{
private boolean flag;
public ThreadDemo(boolean flag){
this.flag=flag;}
public void run(){
while(true){
if(flag){
//如果变量值是true,先进去A,在进去B
synchronized(LockA.locka){
System.out.println("if...locka");
synchronized(LockB.lockb){
System.out.println("else...lockb");
}
}
}else{
//变量的值是false,先进去B,在进去A
synchronized(LockB.lockb){
System.out.println("if...lockb");
synchronized(LockA.locka){
System.out.println("else...locka");
}
}
}
}
}
}
class DuoXianCheng{
public static void main(String[] args){
ThreadDemo d1=new ThreadDemo(false);
ThreadDemo d2=new ThreadDemo(true);
Thread t1=new Thread(d1);
Thread t2=new Thread(d2);
t1.start();
t2.start();
}
} |
|