zoukankan      html  css  js  c++  java
  • 面试问题 :单例模式

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

    代码:

    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
  • 相关阅读:
    什么是JAVA内容仓库(Java Content Repository)(3)
    Documentum 中 Type定义与存储
    洛谷 P1421 小玉买文具
    校内 第一届ACM校赛——热身赛
    洛谷 P1307 数字反转
    洛谷P1579 哥德巴赫猜想(升级版)
    51单片机 第三节 独立按键
    51单片机 第四节 数码管
    校内 第一届ACM校赛——正赛
    51单片机 第二节 点亮LED
  • 原文地址:https://www.cnblogs.com/open88/p/6808288.html
Copyright © 2011-2022 走看看