JAVA中的单例模式笔记

如何保证对象的唯一性?

步骤:

1.一个类中只要提供了构造方法 就可以产生多个对象,完全不能够保证唯一,既然创建对象数量不可控,干脆不让其他程序建立对象,直接私有化构造方法,不让其他程序创建。

2.不让其他程序创建,那么对象在哪里呢?干脆在本类中创建一个对象,可以对对象进行可控。

3.创建完对象之后,需要提供方法来返回对象

代码示例:

第一种是饿汉式单例模式:

//创建一个Single类  public class Single {          //1、私有化构造方法          private Single(){            }          //2、创建本类对象          private static final Single s = new Single();          //3、定义方法,返回对象          public static Single getInstance(){              return s;        }    }

第二种是懒汉式单例模式(懒加载):

public class Single2 {  	//延迟加载    懒汉式单例模式  	private Single2(){    	}  	private static Single2 s2=null;    	public static Single2 getInstance(){  		if(s2==null){  			s2=new Single2();  		}  		return s2;  	}  }

测试获取的对象是否一致:

//创建一个SingleTest类  public class SingleTest {      public static void main(String[] args) {          //这样我们就可以保证获取对象的唯一性了          Single s1 = Single.getInstance();          Single s2 = Single.getInstance();          Single s3 = Single2.getInstance();          Single s4 = Single2.getInstance();          System.out.println(s1==s2);//true          System.out.println(s3==s4);//true      }  }

解决多线程并发访问的线程安全问题,和加上同步机制后的效率降低问题:

public class Single2 {      //延迟加载    懒汉式单例模式      private Single2(){}      private static Single2 s2=null;        public static Single2 getInstance(){      //通过双重判断的方式,解决效率问题,减少对锁的判断次数          if(s2==null){              synchronized (Single2.class) {                  if(s2==null){                      s2=new Single2();                  }              }          }          return s2;      }  }