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
  • 相关阅读:
    http请求的GET和POST请求:查询和新增(server.php)
    http请求的GET和POST请求:查询和新增(ajax)
    shell中$(( )) 与 $( ) 还有${ }的区别
    linux查看操作系统版本信息
    Linux useradd 与 adduser的区别, /sbin/nologin 与 /bin/bash
    红帽触摸屏屏幕180旋转
    Sed命令n,N,d,D,p,P,h,H,g,G,x解析3
    sed命令
    sed高级用法:模式空间(pattern space)和保持空间(hold space)
    sed的模式空间和保持空间
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3438882.html
Copyright © 2011-2022 走看看