zoukankan      html  css  js  c++  java
  • Java中的五种单例模式实现方法

    [代码] Java中的五种单例模式实现方法

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    package singleton;
     
    /**
     * @author lei
     * 单例模式的五种写法:
     * 1、懒汉
     * 2、恶汉
     * 3、静态内部类
     * 4、枚举
     * 5、双重校验锁
     * 2011-9-6
     */
    /**
     *五、 双重校验锁,在当前的内存模型中无效
     */
    class LockSingleton{
        private volatile static LockSingleton singleton;
        private LockSingleton(){}
         
        //详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html
        public static LockSingleton getInstance(){
            if(singleton==null){
                synchronized(LockSingleton.class){
                    if(singleton==null){
                        singleton=new LockSingleton();
                    }
                }
            }
            return singleton;
        }
         
    }
    /**
     * 四、枚举,《Effective Java》作者推荐使用的方法,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
     */
    enum EnumSingleton{
        INSTANCE;
        public void doSomeThing(){
        }
    }
    /**
     * 三、静态内部类 优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading
     */
    class InternalSingleton{
        private static class SingletonHolder{
            private final static  InternalSingleton INSTANCE=new InternalSingleton();
        }  
        private InternalSingleton(){}
        public static InternalSingleton getInstance(){
            return SingletonHolder.INSTANCE;
        }
    }
    /**
     * 二、恶汉,缺点:没有达到lazy loading的效果
     */
    class HungrySingleton{
        private static HungrySingleton singleton=new HungrySingleton();
        private HungrySingleton(){}
        public static HungrySingleton getInstance(){
            return singleton;
        }
    }
    /**
     * 一、懒汉,常用的写法
     */
    class LazySingleton{
        private static LazySingleton singleton;
        private LazySingleton(){
        }
        public static LazySingleton getInstance(){
            if(singleton==null){
                singleton=new LazySingleton();
            }
            return singleton;
        }  
    }
  • 相关阅读:
    solr dataimport 数据导入源码分析(九)
    正确理解ThreadLocal
    solr dataimport 数据导入源码分析(六)
    solr dataimport 数据导入源码分析(七)
    solr dataimport 数据导入源码分析(八)
    solr dataimport 数据导入源码分析(一)
    solr dataimport 数据导入源码分析(五)
    OpenGL光照、键盘
    OpenGL着色
    OpenGL纹理映射
  • 原文地址:https://www.cnblogs.com/zhaoYuQing-java2015/p/4657929.html
Copyright © 2011-2022 走看看