面试常见有关问题 死锁代码&单例模式
面试常见问题 死锁代码&单例模式
2)死锁类
测试:
1.写一个死锁
1)写一个锁类包含两个锁 锁A以及锁B
package cn.itcast.dieLock; public class MyLock { public static Object objA=new Object();//定义两把锁 public static Object objB=new Object(); }
2)死锁类
package cn.itcast.dieLock; public class DieLock extends Thread{ private boolean flag; public DieLock(boolean flag){ this.flag=flag; } @Override public void run() { if(flag){ synchronized (MyLock.objA) { System.out.println("if objA"); synchronized (MyLock.objB) { System.out.println("if objB"); } } }else{ synchronized (MyLock.objB) { System.out.println("else objB"); synchronized (MyLock.objA) { System.out.println("else objA"); } } } } }3)测试:
package cn.itcast.dieLock; public class DieLockTest { public static void main(String[] args) { DieLock d1=new DieLock(true); DieLock d2=new DieLock(false); d1.start(); d2.start(); } }2.单例模式的恶汉式:
package cn.itcast.model; public class SingleModel { private SingleModel(){}//私有化 private static SingleModel model=new SingleModel();//恶汉式一来就new对象 public static SingleModel getInstance(){ return model; } }测试:
package cn.itcast.model; public class SingleTest { public static void main(String[] args) { SingleModel model = SingleModel.getInstance(); SingleModel model2 = SingleModel.getInstance(); System.out.println(model==model2); } }打印结果:true
3.单例模式的懒汉式只有用到的时候才new对象
package cn.itcast.model; public class SingleModel2 { private SingleModel2(){} private static SingleModel2 model=null;//懒汉式 一来的时候不new public synchronized static SingleModel2 getInstance(){ if(model==null){ model=new SingleModel2(); } return model; } }
测试:
package cn.itcast.model; public class SinlgeMode2Test { public static void main(String[] args) { SingleModel2 model=SingleModel2.getInstance(); SingleModel2 mode2 = SingleModel2.getInstance(); System.out.println(model==mode2); } }运行结果:true
注意:恶汉式开发的时候使用,因为没有线程安全问题,懒汉式有线程安全的问题,因此面试的时候经常问,但是面试的时候一定要加 同步锁!
版权声明:本文为博主原创文章,未经博主允许不得转载。