• 面试问题 :单例模式


    面试的时候经常遇到的一个问题, 写一个单例模式 说说他的优缺点。

    代码:

    public class Singleton {
        private static volatile Singleton instance = null;
        // 私有构造方法 必要!
        private Singleton(){
        }
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }

    }

    1、需要注意的点

    其中需要注意的点主要有三点
    (1) 私有化构造函数
    (2) 定义静态的Singleton instance对象和getInstance()方法
    (3) getInstance()方法中需要使用同步锁synchronized (Singleton.class)防止多线程同时进入造成instance被多次实例化
    可以看到上面在synchronized (Singleton.class)外又添加了一层if,这是为了在instance已经实例化后下次进入不必执行synchronized (Singleton.class)获取对象锁,从而提高性能。

    Ps: 也有实现使用的是private static Object    obj      = new Object();加上synchronized(obj),实际没有必要多创建一个对象。synchronized(X.class) is used to make sure that there is exactly one Thread in the block.

    2、单例的优缺点
    单例主要有两个作用
    (1) 保持程序运行过程中该类始终只存在一个示例
    (2) 对于new性能消耗较大的类,只实例化一次可以提高性能

    缺点

    1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

    2、单例类的职责过重,在一定程度上违背了“单一职责原则”。

    3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

    Old soldiers never die
  • 相关阅读:
    JavaScript事件冒泡简介及应用
    个人作业——软件工程实践总结&个人技术博客
    个人技术总结
    个人作业——软件测评
    寒假作业(2/2)
    寒假作业(1/2)
    gitlab-ci.yml可用关键字描述
    gitlab-Runner配置参数详解
    gitlab-ci部署实现持续集成(centos7)
    linux时间同步操作命令
  • 原文地址:https://www.cnblogs.com/open88/p/6808288.html
Copyright © 2020-2023  润新知