多线程下不可不考虑的死锁问题
package thread;
/*
引起死锁的四个条件:
1、互斥:至少有一个资源必须独享
2、占有并等待:进程必须占有至少一个资源,并且等待另一个资源
3、非抢占:资源不可抢占,只有进程完成后释放
4、循环等待:有一组进程循环等待对方的资源
Java中出现死锁的其中一个情况:同步中嵌套同步。
*/
public class Thread_5_DeadLockDemo {
public static void main(String[] args)
{
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
t1.start();
t2.start();
}
}
class Test implements Runnable{
private boolean flag;
Test(boolean flag){
this.flag = flag;
}
public void run(){
if(flag){
while(true){
synchronized(MyLock.locka){
System.out.println(Thread.currentThread().getName()+"...if lock a ");
synchronized(MyLock.lockb){
System.out.println(Thread.currentThread().getName()+"...if lock b");
}
}
}
}
else{
while(true){
synchronized(MyLock.lockb){
System.out.println(Thread.currentThread().getName()+"..else lock b");
synchronized(MyLock.locka){
System.out.println(Thread.currentThread().getName()+".....else lock a");
}
}
}
}
}
}
//两个锁,分别由两个线程获得,并且互相等待对方的锁
class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}