首页 » 技术分享 » 两个单例小程序

两个单例小程序

 

单例:通俗的说就是单个实例,不论啥时候都想获得同一份实例。

第一种方式:

package com.guohao.demo1;

public class Danli1 {

public static void main(String[] args) {
MyDanLi demo1=MyDanLi.getDanLi();
MyDanLi demo2=MyDanLi.getDanLi();
System.out.println(demo1==demo2);

}

}
class MyDanLi{
private static MyDanLi instance=new MyDanLi();
private MyDanLi(){}

public static MyDanLi getDanLi(){
return instance;
}
}

输出:true

第二种方式:

package com.guohao.demo1;

public class Danli2 {
public static void main(String[] args) {
MyDanLi2 demo3=MyDanLi2.getDanLi2();
MyDanLi2 demo4=MyDanLi2.getDanLi2();
System.out.println(demo3==demo4);
}
}
class MyDanLi2{
private static MyDanLi2 instance=null;
private MyDanLi2(){}

public static synchronized MyDanLi2 getDanLi2(){
if(instance==null){
instance=new MyDanLi2();
}
return instance;
}
}

输出:true

总结:单例中必须保证有一个private的构造方法,以此来保证不能从外部来new对象,只能通过get方法得到,并且不论什么时候调用这个方法,获得的实例(instance)都是同一份。

注:第二种方式中synchronized 是防止产生两个instance。你比如:当一个线程进来走到if判断,刚判断完instance==null 这时想instance=new MyDanLi2();刚想new,但还没来得及new时,第二个哥们也走到if(instance==null)这里,于是第一个哥们new了,第二个哥们也new了,就有俩instance了。虽然第二个会把第一个覆盖,但是还是避免这种情况的好。

转载自原文链接, 如需删除请联系管理员。

原文链接:两个单例小程序,转载请注明来源!

0