JAVA中的单例模式笔记
- 2020 年 3 月 2 日
- 筆記
如何保证对象的唯一性?
步骤:
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; } }