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();
    }
    
    
  • 相关阅读:
    Go grpc 基本使用
    线程之间的数据库隔离方案
    mysql创建用户并设置所有权限
    Mysql InnoDB 共享表空间和独立表空间
    DB2错误码信息
    PhotoshopManager(缩放图片file---->byte[])
    SaveManager+DownloadManager(下载img,voice以及保存)
    ViewPager
    RegistereManager
    ServiceManager
  • 原文地址:https://www.cnblogs.com/A-yes/p/12026943.html
Copyright © 2011-2022 走看看