代码出现死锁以及解决方案
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占有的资源。
--------------------------------------------------------------------------------------------------------------------------------------
互斥: 一次性 申请所有资源,不存在等待问题了。
不可抢占: 如果申请不到资源,在一定时间后,主动释放抢占的资源,这样就解决了不可抢占的条件。
循环等待:
---------------------------------------------------------------------------
国之殇,未敢忘!
南京大屠杀!
731部队!
以及核污染水排海等一系列全无人性的操作,购买他们的食品和为它们提供帮助只会更加变本加厉的害你,呼吁大家不要购买日本相关产品
昭昭前事,惕惕后人
吾辈当自强,方使国不受他人之侮!
---------------------------------------------------------------------------
作者:三号小玩家
出处:https://www.cnblogs.com/q1359720840/
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 版权信息