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
  • 相关阅读:
    CTR校准
    CTR的贝叶斯平滑
    FTRL 使用tensorflow的实现
    深入理解AUC
    tensorflow wide deep 介绍
    什么是卷积神经网络?为什么它们很重要?
    深度学习中 Batch Normalization为什么效果好
    处理excel将下标转换为ABCD列
    ssh无法登录,提示Pseudo-terminal will not be allocated because stdin is not a terminal.
    sudo: no tty present and no askpass program specified
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3438882.html
Copyright © 2011-2022 走看看