zoukankan      html  css  js  c++  java
  • Java复习11. 单例编程

    Java复习11. 单例编程
    1.最简单的写法,那个方式是线程不安全的
    public class Singleton {
        private static Singleton instance;
        private Singleton(){}
        public static Singleton getInstance(){
             if(instance == null){
                 instance = new Singleton();
            }
             return instance ;
        }
    }
    2.因为上面的是线程不安全的,所以我们确保线程安全的方式使用 synchronized修饰 getInstance方法,这样的话确保了线程的安全,但是有问题,效率很低,大多数情况下此方法不需要同步,杀鸡用牛刀,有点过了
    public class Singleton {
        private static Singleton instance;
        private Singleton(){}
        public static synchronized Singleton getInstance(){
             if(instance == null){
                 instance = new Singleton();
            }
             return instance ;
        }
    }
    3.确保线程安全我们使用另一种方式,这一种方式在声明单例的时候,就已经将一个对象初始化好,但是不知道什么时候用,在程序启动的时候就初始化好了,增加的系统的负担和启动时间,效率不高。没有达到 lazyloading的效果。而且只允许一种方式调用实例。这种方式也是线程安全的,因为他是基于 classLoad机制的。
    public class Singleton {
        private static Singleton instance = new Singleton();
        private Singleton(){}
        public static Singleton getInstance(){
             return instance ;
        }
    }
    4.静态内部类的实现方式
    这一种方式同样是利用了 classloader的机制来保证初始化 instance时只有一个线程,但是区别上一种方式的是,这里起到了 lazyloading的效果,这里 singleton被状态的时候,, instance没有被初始化。因为 singletonholer没有被主动地调用,,只有通过显示调用的方式,才会装在 SingletonHolder class 进而才会初始化instance
    public class Singleton {
        private static class SingletonHolder{
             private static final Singleton INSTANCE = new Singleton();
        }
        private Singleton(){}
        public static final Singleton getInstance(){
             return SingletonHolder.INSTANCE;
        }
    }
    5.双重校验锁
    public class Singleton {
        private volatile static Singleton singleton;
        private Singleton(){}
        public static Singleton getInstance(){
             if(singleton   == null){
                 synchronized(Singleton.class){
                     if(singleton == null){
                         singleton = new Singleton();
                    }
                }
            }
             return singleton ;
        }
    }
    这种叫做双重校验锁机制,需要在 jdk1.5之后才可以。
    最好的是使用双重校验锁的机制实现单例程序
     
    YangTengfei
    2013.11.23
  • 相关阅读:
    jquery的ztree操作
    原创-使用pywinauto和swapy-ob-0.4.3进行dotnet的winform程序控制(二)
    原创-使用pywinauto进行dotnet的winform程序控制(一)
    javascript“命名空间”的费曼输出[原创]
    IIS7上传4M文件以上文件出现“Post大小超出允许的限制”错误解决方法
    OpenProj打开不了或者提示”Failed to load Java VM Library”的错误的解决方案
    项目管理中,开始到完成、完成到开始、开始到开始、和完成到完成的关系图解
    我的项目管理之干系人分析在单位项目中的运用
    关于学习js的Promise的心得体会
    vue.js与后台模板引擎“双花括号”冲突时的解决办法
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3438882.html
Copyright © 2011-2022 走看看