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

问了很多现在在互联网公司的师哥师姐,现在很多大公司,为了简化代码量,很多都是用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();
	}
}

你可能感兴趣的:(java,面试)