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");
        }
    
    }

     

     

     

     

    人生没有彩排,每一天都是现场直播
  • 相关阅读:
    Ubuntu 14.04的SWAP 为0
    堆和栈的区别(转过无数次的文章)
    加法乘法判断溢出(转)
    大端格式、小端格式(转)
    Linux 目录操作和4中文件拷贝效率测试
    Linux使用标准IO的调用函数,分3种形式实现
    支持 onload 事件的元素
    $().each() 和 $.each()
    npm install --save 与 npm install --save-dev 的区别
    <!DOCTYPE html>作用
  • 原文地址:https://www.cnblogs.com/timfruit/p/11716519.html
Copyright © 2011-2022 走看看