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
  • 相关阅读:
    POJ1125-Stockbroker Grapevine【Floyd】(模板题)
    Codeforces 862B (二分图染色)
    hdu3047 Zjnu Stadium【带权并查集】
    HDU1532 网络流最大流【EK算法】(模板题)
    hdu 2063 过山车【匈牙利算法】(经典)
    HDU-2066-一个人的旅行 【Dijkstra】
    HDU 3625 Examining the Rooms【第一类斯特灵数】
    HDU4372-Count the Buildings【第一类Stirling数】+【组合数】
    HDU 6114 Chess【逆元+组合数】(组合数模板题)
    HDU1211 密文解锁 【扩展欧几里得】【逆元】
  • 原文地址:https://www.cnblogs.com/open88/p/6808288.html
Copyright © 2011-2022 走看看