zoukankan      html  css  js  c++  java
  • 单例模式的5种形式

    有过编程经验的朋友都知道设计模式中的单例模式,最近又重新看了一遍设计模式,今天将单例模式的几种形式介绍一下:

    1、懒汉形式(延迟加载)

    Singleton.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    public class Singleton{
        private static Singleton singleton;
    
        private Singleton() {
        }
    
        public synchronized static Single newInstance() {
            if (singleton== null) {
                singleton= new Singleton();
            }
            return singleton;
        }
    }
    

    这个是标准的单例模式,通过newInstance里面的判断来进行延迟加载单例对象,这里加了synchronized关键字可以避免多线程问题,但会影响程序性能。

    2、饿汉形式(贪婪加载)

    Singleton.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public class Singleton {
        private static Singleton singleton= new Singleton();
    
        private singleton() {
        }
    
        public static Singleton newInstance() {
            return singleton;
        }
    }
    

    在单例对象声明的时候就直接初始化对象,可以避免多线程问题,但是如果对象初始化比较复杂,会导致程序初始化缓慢。

    3、双重检查加锁

    Singleton.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    public class Singleton {
        private volatile static Singleton singleton;
    
        private Singleton() {
        }
    
        public static Singleton newInstance() {
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    }
    

    这个是懒汉形式的加强版,将synchronized关键字移到了newInstance方法里面,同时将singleton对象加上volatile关键字,这种方式既可以避免多线程问题,又不会降低程序的性能。但volatile关键字也有一些性能问题,不建议大量使用。

    4、Lazy initialization holder class

    Singleton.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    public class Singleton {
        private static class SingletonHolder {
            private static Singleton singleton = new Singleton();
        }
    
        private Singleton() {
        }
    
        public static Singleton newInstance() {
            return SingletonHolder.singleton;
        }
    }
    

    这里创建了一个内部静态类,通过内部类的机制使得单例对象可以延迟加载,同时内部类相当于是外部类的静态部分,所以可以通过jvm来保证其线程安全。这种形式比较推荐。

    5、枚举

    Singleton.java
    1
    2
    3
    
    public enum Singleton {
        singleton
    }
    

    单因素的枚举类已经实现了单例,这种方法更加简单。

  • 相关阅读:
    android: 建立和断开a2dp link 相关方法总结
    Java: volatile和synchronized的区别 (转)
    shell 将变量当命令执行的几种方式
    tcp 自连接(主机的端口和自己建立连接)
    sed使用
    海尔风冷冰箱冷冻室最底层结冰 问题解决
    k8s 传参数的两种方式一种是 环境变量 拼接 另一种说是yaml传参到配置文件的表示怀疑要验证????????????????????????????
    k8s 集群中的etcd故障解决
    dockerfile
    使用VIM/VI给文件加密和解密
  • 原文地址:https://www.cnblogs.com/yang82/p/7811064.html
Copyright © 2011-2022 走看看