package DeadLock; public class DeadLock { public static String obj1 = "obj1"; public static String obj2 = "obj2"; public static String obj3 ="obj3"; public static void main(String[] args){ Thread a = new Thread(new Lock1()); Thread b = new Thread(new Lock2()); a.start(); b.start(); } } class Lock1 implements Runnable{ public void run(){ try{ System.out.println("Lock1 running"); while(true){ synchronized(DeadLock.obj1){ System.out.println("Lock1 lock obj1"); Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2 synchronized(DeadLock.obj2){ System.out.println("Lock1 lock obj2"); } } } }catch(Exception e){ e.printStackTrace(); } } }
假如a线程先运行,线程lock1抢占资源(synchronized) obj1锁住然后暂停30秒给lock2抢占资源的时间,lock2抢占obj2并抢占(synchronized)obj2.然后暂停30秒,此时线程a运行想要抢占资源obj2但是抢占不到因为已经被线程b抢占会陷入等待class Lock2 implements Runnable{ public void run(){ try{ System.out.println("Lock2 running"); while(true){ synchronized(DeadLock.obj2){ System.out.println("Lock2 lock obj2"); Thread.sleep(3000); synchronized(DeadLock.obj1){ System.out.println("Lock2 lock obj1"); } } } }catch(Exception e){ e.printStackTrace(); } }}
假如b线程先运行,情况如上
输出情况:
Lock1 running
Lock1 lock obj1
Lock2 running
Lock2 lock obj2
线程停止只会跑出四行。如果换其他字符串。控制台会不断输出。
1281

被折叠的 条评论
为什么被折叠?



