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();
    }
    
    
  • 相关阅读:
    Java代码检测工具
    java编程工具
    100-days: The one day
    前端书籍整理
    vue 学习笔记(二)
    从零开始写一个npm包及上传
    Vue Baidu Map 插件的使用
    对数组对象进行过滤
    使用css方法使footer保持在页面的最底部
    判断是第一次打开界面?还是刷新
  • 原文地址:https://www.cnblogs.com/A-yes/p/12026943.html
Copyright © 2011-2022 走看看