给一段代码线程死锁的代码你看一下:
class Test implements Runnable{
private static final String KEY1="KEY1";
private static final String KEY2="KEY2";
private boolean lock;
public Test(boolean lock){
this.lock = lock;
}
public void run(){
if(lock){
synchronized(KEY1){//第一次锁KEY1
try{
Thread.sleep(3000);
}catch(Exception e){
}
System.out.println("给我KEY2我要使用!");
synchronized(KEY2){//第二次锁KEY2
System.out.println("我拿到KEY2运行结束!");
}
}
}else{
synchronized(KEY2){//第一次锁KEY2
try{
Thread.sleep(3000);
}catch(Exception e){
}
System.out.println("Give me KEY1,I will use!");
synchronized(KEY1){//第二次锁KEY1
System.out.println("我拿到KEY1运行结束!");
}
}
}
}
public static void main(String args[]){
new Thread(new Test(true)).start();
new Thread(new Test(false)).start();
}
}
其实线程死锁很简单:由于线程能被阻塞,更由于synchronized方法能阻止其他线程访问本对象,因此可能会造成线程一等待线程二释放某个对象。线程二又等待线程一释放对象。这样就形成了一个环。每个线程都在等待对方释放资源。而它们谁都不能运行,这就造成了死锁了。 |