zoukankan      html  css  js  c++  java
  • Java 单例模式

    代码:

    双重检查,懒汉模式

    public class Singleton {
        private static Singleton INSTANCE;
        private Singleton() {}
        public static Singleton getInstance() {
            if (INSTANCE == null) {
                synchronized(Singleton.class){
                    if(INSTANCE == null) {
                        INSTANCE = new Singleton();
                    }
                }
            }
            return INSTANCE;
        }
    }
    • 优点:使用了双重检查,很大程度上避免了线程不安全,同时也避免了不必要的锁开销。这里要注意,虽然未使用volatile关键字,但是这里的synchronized已经保证了INSTANCE写操作对其它线程读操作的可见性。
    • 缺点:性能开销有点大

    静态常量,饿汉模式

    public class Singleton {
        private static final Singleton INSTANCE = new Singleton();
        private Singleton() {}
        public static Singleton getInstance() {
            return INSTANCE;
        }
    }
    • 优点:实现简单,无线程同步问题
    • 缺点:在类装载时完成实例化。若该实例一直未被使用,则会造成资源浪费

    静态代码块,饿汉模式

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

    跟上面的基本一样。

    静态内部类,懒汉模式(感觉最好的一个)

    public class Singleton {
        private Singleton() {}
        public static Singleton getInstance() {
            return InnerClass.INSTANCE;
        }
    
        private static class InnerClass {
            private static final Singleton INSTANCE = new Singleton();
        }
    }
    • 优点:无线程同步问题,实现了懒加载(Lazy Loading)。因为只有调用getInstance时才会装载内部类,才会创建实例

    http://www.jasongj.com/design_pattern/singleton/

    http://mp.weixin.qq.com/s/1fQkkdtzYh_OikbYJnmZWg

  • 相关阅读:
    Oracle EXP-00091解决方法
    Oracle 表空间的概念
    每天一点点oracle
    ntp服务问题
    Centos 7.4 安装samba服务
    Oracle group by
    Ansible介绍
    Gitlab应用——开发人员fetch分支,合并到master主分支申请
    Gitlab应用——系统管理
    Gitlab安装配置管理
  • 原文地址:https://www.cnblogs.com/hongdada/p/6230549.html
Copyright © 2011-2022 走看看