zoukankan      html  css  js  c++  java
  • 单例模式的几种常见写法

    第一种:最简单的写法,缺点在于实例在类初始化的时候就创建了,如果在整个项目中都没有使用到该类,就会创建内存空间的浪费。

    public class Singleton {
        
        private Singleton(){}
        
        private static Singleton instance = new Singleton();
        
        public static Singleton getInstance(){
            return instance;
        }
    }

    第二种:解决了写法一在类初始化的时候就创建实例的问题,然而只能在单线程中使用,在多线程中使用如果多个线程同时进入if语句中,就可能出现创建多个实例的问题。

    public class Singleton {
        
        private Singleton(){}
        
        private static Singleton instance;
        
        public static Singleton getInstance(){
            if(instance == null){
                instance = new Singleton();        
            }
            return instance;
        }
    }

    第三种:解决了写法二可能出现的问题,可以在多线程中使用。缺点在于synchronized关键字会强制一次只能让一个线程进入方法中,其他线程不得不阻塞等待该线程退出方法。

    public class Singleton {
        
        private Singleton(){}
        
        private static Singleton instance;
        
        public synchronized static Singleton getInstance(){
            if(instance == null){
                instance = new Singleton();        
            }
            return instance;
        }
    }

    第四种:这种写法的好处是充分利用了静态内部类的特点,它的初始化操作跟外部类是分开的。在没有调用 getInstance() 方法之前,静态内部类不会进行初始化,在第一次调用该方法后就生成了唯一一个实例。

    public class Singleton {
        
        private Singleton(){}
        
        private static class SingletonHolder {
            private static Singleton instance = new Singleton();
        }
        
        public static Singleton getInstance(){
            return SingletonHolder.instance;
        }
    }
  • 相关阅读:
    贝壳找房魔法师顾问[并查集+DAG判断]
    Ubuntu 18.04 安装 virtualbox
    Ubuntu 编译安装 nDPI
    Ubuntu 16.04 安装WPS
    HDU 5046 Airport【DLX重复覆盖】
    Codeforces 622C Not Equal on a Segment 【线段树 Or DP】
    UVA 10635 Prince and Princess【LCS 问题转换为 LIS】
    LA 2995 Image Is Everything
    LA 3708 Graveyard
    HDU 5212 Code【莫比乌斯反演】
  • 原文地址:https://www.cnblogs.com/duguangming/p/11631198.html
Copyright © 2011-2022 走看看