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
  • 相关阅读:
    FW: MBA的学费一般在多少?学MBA有啥用?
    【悟】资本思维:这才是真正"赚大钱的逻辑"
    关于印发《北京市引进人才管理办法(试行)》的通知
    基于wordpress电商解决方案 + POS在线轻量级系统
    SAP Fasion FMS solution 时尚商品行业解决方案
    SAP IS-Retail Promotion and POS Bonus Buy integration
    SAP CARR for retails solution SAP零售集成方案
    Forest-一款比httpClient,okhttp更优雅人性化的http请求组件
    IDEA 日志插件 MyBatis Log Plugin 在线格式化日志工具
    Jenkins ERROR: Server rejected the 1 private key(s)
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3438882.html
Copyright © 2011-2022 走看看