ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式(一)单例模式

2020-09-22 23:34:19  阅读:191  来源: 互联网

标签:LazySingleton 模式 uniqueInstance 实例 static private 单例 设计模式 public


1.1定义

  保证一个类只有一个实例,并且提供一个全局访问点

1.2应用场景

  适用于重量级对象,不需要多个实例。比如说:线程池、数据库连接池、缓存、日志、注册表。

1.3懒汉模式

  经典单例模式实现:

 

public class LazySingleton {

    //利用一个静态变量来记录Singleton类的唯一实例
    private static LazySingleton uniqueInstance;

    //将构造器声明为私有,只有LazySingleton内才能调用构造器
    private LazySingleton() {
    }
    
    //提供一个get方法获取实例对象
    public static LazySingleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new LazySingleton();
        }
        return uniqueInstance;
    }

}

多线程环境中,上述代码可能会产生多个实例,那么加上synchronized关键字到getInstance()方法中,会怎样呢?

public class LazySingleton {

    //利用一个静态变量来记录Singleton类的唯一实例
    private static LazySingleton uniqueInstance;

    //将构造器声明为私有,只有LazySingleton内才能调用构造器
    private LazySingleton() {
    }
    
    //提供一个get方法获取实例对象(方法上加上synchronized,防止并发)
    public static synchronized LazySingleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new LazySingleton();
        }
        return uniqueInstance;
    }

}

  此时,多线程的问题解决了,但是方法同步非常消耗性能,如果对性能有很高要求的话,显然这不是一个很好的做法。

双重检查加锁

public class LazySingleton {

    //利用一个静态变量来记录Singleton类的唯一实例(加上volatile关键字,防止指令重排)
    private volatile static LazySingleton uniqueInstance;

    //将构造器声明为私有,只有LazySingleton内才能调用构造器
    private LazySingleton() {
    }

    //提供一个get方法获取实例对象
    public static LazySingleton getUniqueInstance() {
        if (uniqueInstance == null) {
            synchronized (LazySingleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new LazySingleton();
                }
            }
        }
        return uniqueInstance;
    }
}

  双重检查加锁,首先判断是否已经创建实例了,才进入同步代码块,只有第一次创建实例才会同步。

1.4饿汉模式

  同懒汉模式不一样,饿汉模式一开始就会创建一个实例

  

public class HungrySingleton {
    
    //初始化时就创建一个实例
    private  static HungrySingleton uniqueInstance = new HungrySingleton();
    
    private HungrySingleton() {
    }
    
    public static HungrySingleton getUniqueInstance() {
        return uniqueInstance;
    }
}

1.4利用静态内部类实现

public class StaticInnerClassSingleton {
    
    private static class InnerSingleton {
        private static StaticInnerClassSingleton uniqueSingleton = new StaticInnerClassSingleton();
    }

    public static StaticInnerClassSingleton getUniqueSingleton() {
        return InnerSingleton.uniqueSingleton;
    }
}

1.5枚举实现

public enum SingletonEnum {
    
    INSTANCE;
}

 

标签:LazySingleton,模式,uniqueInstance,实例,static,private,单例,设计模式,public
来源: https://www.cnblogs.com/legalyuke/p/13715546.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有