死锁的Lambda写法(面试常考)

    技术2022-07-16  69

    问了很多现在在互联网公司的师哥师姐,现在很多大公司,为了简化代码量,很多都是用lambda写的。 如果我们在平时加强对Lambda的学习,面试官会认为你是一个有自主学习能力的人。 在面试中,面试官经常会让你手撕的代码就是死锁,同时死锁的代码你如果用Lambda撕出来,那么面试官一定会对你另又一波认识!

    基于上述情况,我专门去用Lambda写了一遍,真的是简化了很多代码量!

    package DeadLockMain; //死锁:多个线程分别抱着对方需要的资源,然后形成僵持。 public class deadLock { private static Object resouce1 = new Object(); private static Object resouce2 = new Object(); public static void main(String[] args) { new Thread(()->{ synchronized(resouce1) { System.out.println(Thread.currentThread()+"get resource1"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread()+"waiting get resourvce2"); synchronized (resouce2) { System.out.println(Thread.currentThread()+"get resource2"); } } },"线程1").start(); new Thread(()->{ synchronized(resouce2) { System.out.println(Thread.currentThread()+"get resource2"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread()+"waiting get resource1"); synchronized (resouce1) { System.out.println(Thread.currentThread()+"get resorce1"); } } },"线程2").start(); } }

    那么如何解决死锁这一现象呢? 最简单的一种方法就是改变加锁顺序,下面的代码对线程2的加锁顺序做出了改变!

    package DeadLockMain; /** * 尝试使用Lamdba表达式写如何解决死锁的情况 * 主要对线程2中循环加锁顺序做了改变 * @author Administrator * */ public class DeadLock02 { private static Object resource1 = new Object(); private static Object resource2 = new Object(); public static void main(String[] args) { new Thread(()->{ synchronized(resource1) { System.out.println(Thread.currentThread()+"get Resource1"); try{ Thread.sleep(1000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread()+"waiting get Resource2"); synchronized(resource2) { System.out.println(Thread.currentThread()+"get Resource2"); } } },"线程1").start(); new Thread(()->{ synchronized(resource1) { System.out.println(Thread.currentThread()+"get Resource1"); } try { Thread.sleep(1000); }catch(InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread()+"waiting get resource2"); synchronized(resource2) { System.out.println(Thread.currentThread()+"get resource2"); } },"线程2").start(); } }
    Processed: 0.021, SQL: 9