zoukankan      html  css  js  c++  java
  • 学习设计模式

    学习设计模式 - 单例模式

    一丶定义

          确保某个类只有一个实例, 而且自行实例化并向整个系统提供这个实例.(Ensure a class has only one instance, and provide a global point of access to it.)

     

    二丶五种实现方式

         1) 饿汉模式

            

    public class Singleton1 {
    
        private static final Singleton1 instance=new Singleton1(); // 类加载时就实例化
    
        private Singleton1(){}  //私有构造函数
    
        public static Singleton1 getInstance(){
            return instance;
        }
    
    }

      2) 懒汉模式 + synchronized同步锁

    public class Singleton2 {
    
        private static  Singleton2 instance=null;
    
        private Singleton2(){} //私有构造函数
    
        public static synchronized Singleton2 getInstance(){ //每次获取单例都需要获取锁, 并发情况下性能不是很好
            if(instance==null){
                instance=new Singleton2();
            }
            return instance;
        }
    
    
    }
    synchronized同步锁

      3) 懒汉模式 + synchronized同步锁 + 双重检查

    public class Singleton3 {
    
        //volatile确保多个线程能够可以看到实例化
        private volatile static Singleton3 instance=null;
    
        private Singleton3(){} //私有构造函数
    
        public static Singleton3 getInstance(){
            if(instance==null){//第一次检查
                synchronized (Singleton3.class){
                    if(instance==null){//第二次检查
                        instance=new Singleton3();
                    }
                }
            }
            return instance;
        }
    
    
    }

       4)l懒汉模式 + 内部类

    public class Singleton4 {
    
        private Singleton4(){}// 私有构造方法
    
        public static Singleton4 getInstance(){
            return InnerSingleton.instance;
    
        }
    
        //内部类
        //类在加载时, 初始化属性会收集在<clinit>方法
        //多个线程调用初始化方法,会被阻塞,确保只有一个线程调用,并保证属性的可见性
        private static class InnerSingleton {
            private static final Singleton4 instance=new Singleton4();
        }
    
    }

      5) 枚举单例

    public enum  Singleton5 {
    
        INSTANCE;
    
        public void doSomething(){
            System.out.println("do something");
        }
    
    }

     

     

     

     

    人生没有彩排,每一天都是现场直播
  • 相关阅读:
    091115 T UI生成的类
    090717 T OOD时的接口
    090713 T 数组不OO
    090723 T Code Generate 的思考
    091101 T IModel
    091018 CH 培训方法论总结
    090615 T 数据库范式
    写程序,逻辑优先!
    091117 T else if 的写法
    091015 CH 培训所想到的
  • 原文地址:https://www.cnblogs.com/timfruit/p/11716519.html
Copyright © 2011-2022 走看看