对于死锁,我们首先明确什么是死锁,然后再避免如何遇到死锁呢。
首先死锁的前提
1. 同步嵌套
2.嵌套的同步持有不同的锁
代码示例:- class Test
- {
- public static void main(String[] args)
- {
- Thread t1 = new Thread(new Demo(true));
- Thread t2 = new Thread(new Demo(false));
- t1.start();
- t2.start();
- }
- }
- class Demo implements Runnable
- {
- private boolean flag;
- Demo(boolean flag)
- {
- this.flag=flag;
- }
- public void run()
- {
- if(flag)
- {
- while(flag==true)
- {
- synchronized(Demo2.obja)//它的锁是obja
- {
- System.out.println("if-----obja");
- synchronized(Demo2.objb)//它的锁是objb
- {
- System.out.println("if-----obja");
- }
- }
- }
- }
- else
- {
- while(flag==false)
- {
- synchronized(Demo2.objb)//它的锁是objb
- {
- System.out.println("else-----obja");
- synchronized(Demo2.obja)//它的锁是obja
- {
- System.out.println("else-----objb");
-
- }
- }
- }
- }
- }
-
- }
- class Demo2
- {
- //定义两个锁
- static Object obja = new Object();
- static Object objb = new Object();
- }
复制代码
这段代码就是个典型的死锁,线程在抢夺CPU的执行权的时候,就会发生你要的锁,我也想要你的锁,但是谁也不给谁,这就造成了死锁,只要把锁给变成同一把锁就哦了,所以多了就容易分不清出现死锁现象!! |