zoukankan      html  css  js  c++  java
  • 单例模式1(3)

    懒汉式

    //加载该类没有创建实例,调用该类创建有且仅有一个实例
    public class LazySingleton {
    
        //volatile:禁止cpu对字节码指令重排序
        //需要volatile关键字修饰Intance,volatile的语义是“禁止CPU对字节码指令重排序”,因为现在电脑是多核,
        //所以JVM在运行的时候会将字节码指令进行重排序优化来更好的执行,所以这就可能会出现线程A的字节码指令执行到一半,
       //线程B的字节码指令就去执行而首先对Intance进行修改,而导致线程A字节码执行到new的时候Intance已经被初始化。这时候就会有问题,所以需要禁止字节码重排序。
        private static volatile LazySingleton ls = null;
        private LazySingleton(){}//避免外部实例
        public static synchronized LazySingleton getInstance(){//每次访问都会同步,影响性能
            if(ls == null){
                ls = new LazySingleton();
            }
            return ls;
        }
    }
    //双重检查加锁(double-checked locking),仅一次同步
    public class LazySingleton2{
        
        private static volatile LazySingleton2 ls2 = null;
        private LazySingleton2(){}//避免外部实例
        public static LazySingleton2 getInstance(){
            if(ls2 == null){
                synchronized(LazySingleton2.class){//仅一次同步 
                    ls2 = new LazySingleton2();
                }
            }
            return ls2;
        }
        
    }

    饿汉式(推荐)

    //加载该类即实例化该对象,自己创建自己
    public class HungarySingleton {
    
        private static final HungarySingleton hs = new HungarySingleton();
        private HungarySingleton(){}
        private static HungarySingleton getInstance(){
            return hs;
        }
    }

    final修饰,仅有一个实例,所以线程安全的,可直接用于多线程。

    静态内部类

    //静态内部类
    //静态内部类,作为类的成员只有该类可以访问(其他类调用该类才可以访问,保证了内部类的成员不被其他类直接调用)
    public class StaticSingleton{
        private static class StaticClassLazy{//私有属性
            private static final StaticSingleton self = new StaticSingleton();//静态私有,只有该类可以调用
        }
        private StaticSingleton(){}//避免外部实例
        public static final StaticSingleton getInstance(){
            return StaticClassLazy.self;//自己的内部成员 调用 它的私有属性
        }
        
    }

    枚举

    //参考枚举如何实例化
    enum enumSingleton{
        es;
        public void doOther(){
            
        }
    }

    容器

    public class containerSingleton{
        private static Map<String,Object> container = new HashMap<String,Object>();//容器,其实是分配的一小块内存
        private containerSingleton(){}
        
    //    public static Map<String, Object> getContainer() {
    //        return container;
    //    }
    //    public static void setContainer(Map<String, Object> container) {
    //        containerSingleton.container = container;
    //    }
        //将set方法改造成注册spring中的bean(模拟)
        public static void registBean(String beanName,Object o) {
            if(!container.containsKey(beanName)){
                container.put(beanName, o);//将bean的名称注入到spring容器,o可以看做bean的实例
            }
        }
        
        //从容器中获取已注册的bean
        public static Object getBean(String beanName) {
            return container.get(beanName);
        }
    }
  • 相关阅读:
    通过Web启动本地应用程序
    类似百度文库文档预览方式实现
    cas4.0 session中返回更多的用户信息
    word转pdf图片问题
    JSON数据转换成table表格
    2017年各银行卡跨行取款收费标准
    解决win8/8.1系统安装.net framework 3.5出现0x800F0906代码错误
    更改Thunderbird的默认语言
    java获取客户端ip地址
    为jquery ajax请求增加正在运行提示
  • 原文地址:https://www.cnblogs.com/zzlcome/p/11077521.html
Copyright © 2011-2022 走看看