两个单例小程序

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

 

第一种方式:

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了。虽然第二个会把第一个覆盖,但是还是避免这种情况的好。

 

你可能感兴趣的:(单例)