zoukankan      html  css  js  c++  java
  • [一天一个设计模式]-[单例模式]

    1. 饿汉模式
    
    public class S{
        private S(){}
        
        private static S s=new S();
        
        public static S get(){
            return s;
        }
    }
    
    
        线程安全,加载时就初始化,根据需求来,此种用法最简单
    
    2. 懒汉模式
    
    public class S{
        
        private S(){}
        
        private static S s;
        
        public static S get(){
            if(s==null){
                s=new S();
            }
            return s;
        }
        
    }
    
    
    线程不安全,会出现多个线程同时进入if判断
    方法上加 synchronized  字段,可以线程安全,但是多线程性能较低,因为即使以已经创建过示例,也会锁住该方法
    
    3. 双重检验锁
    
    public class S{
        private S(){}
        
        private volatile static S s;
        
        public static S get(){
            if(s == null){
                synchronized(S.class){
                    if(s == null){
                        s=new S();
                    }
                }
            }
            return s;
        }
    }
    
    
    线程安全。
    

    如果不加第二个null检验,也会出现创建多个实例的情况,多个线程可以同时进入第一个null检测代码块,都会执行创建语句,只是顺序执行而已

    如果不加volatile 关键字,则第二个null检测时,s可能是线程栈内的副本,不是主内存中的值,而主内存中的值已被其他线程实例化,会出现多次创建实例。

    4. 静态内部类
    public class S{
        private S(){}
        
        private static class I{
            private static final S INSTANCE =new S();
        }
        
        public static S get(){
            return I.INSTANCE ;
        }
        
    }
    
    线程安全
    
    5. 枚举类
    
    public enum S{
        INSTANCE;
        
        public void dosomething(){
            
        }
        
    }
    
    
    //调用
    
    main(){
        S s=S.INSTANCE;
        s.dosomething();
    }
    
    
  • 相关阅读:
    禁止logback输出状态信息
    Idea导出可运行Jar包
    K均值算法
    [转]香农信息论与毒药称球问题
    ajax跨域请求
    Python函数的静态变量
    学倦乱语
    [转]被当做狗和鸡来驱赶的百姓
    numpy文件读写的三对函数
    认真把事办砸是一种能力
  • 原文地址:https://www.cnblogs.com/A-yes/p/12026943.html
Copyright © 2011-2022 走看看