public class Lock1 implements Runnable{ @Override public void run() { System.out.println("lock1 running"); while (true){ try { synchronized (LockUtils.obj1){ System.out.println("lock1 锁 obj1"); Thread.sleep(3000); synchronized (LockUtils.obj2) { System.out.println("lock1 锁 obj2"); } } }catch (Exception e){ e.getMessage(); } } } }
---->
public class Lock2 implements Runnable{ @Override public void run() { System.out.println("lock 2 running"); try { while (true){ synchronized (LockUtils.obj2){ System.out.println("lock2 锁 obj2"); Thread.sleep(3000); synchronized (LockUtils.obj1){ System.out.println("lock2 锁 obj1"); } } } }catch (Exception e){ e.getMessage(); } } }
public class LockUtils { public static String obj1="obj1"; public static String obj2="obj2"; }
public class Main { public static void main(String[] args) { Thread a = new Thread(new Lock1()); Thread b = new Thread(new Lock2()); a.start(); b.start(); } }
程序不结束,还在运行,代码不继续打印
-----------------------------------------------------------------------------------------
产生死锁的四个必要条件:
1.互斥,共享资源x和y只能被一个线程占用;
2.占有且等待,线程01已经取得共享资源x,在等待共享资源y的时候,不释放共享资源x;
3.不可抢占,其他线程不能强行抢占线程01占有的资源;
4.循环等待,线程01等待线程02占有的资源,线程02,等待线程01占有的资源。
--------------------------------------------------------------------------------------------------------------------------------------
互斥: 一次性 申请所有资源,不存在等待问题了。
不可抢占: 如果申请不到资源,在一定时间后,主动释放抢占的资源,这样就解决了不可抢占的条件。
循环等待: