zoukankan      html  css  js  c++  java
  • 单例模式

    保持线程安全的高性能单例模式:双检锁机制:

    public class Singleton {  
      //volatile使主内存变动实时刷新,懒加载模式
    private volatile static Singleton singleton;
      //将构造函数设置为private,阻止其他类直接实例化此类。
    private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }

     保持线程安全的非lazy加载实现单例模式:

    public class Singleton {  
        private static Singleton instance = new Singleton();  
        private Singleton (){}  
        public static Singleton getInstance() {  
        return instance;  
        }  
    }

     使单例模式在进行反序列化之后依然有效,同时保持线程安全:借助枚举类(官方推荐):

    public enum SingleEnum implements Serializable {
        INSTANCE;
        private SingleEnum(){}
        private String content;
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }

    获取单例:

    SingleEnum singleEnum = SingleEnum.INSTANCE;

    验证使用此方式在反序列化后得到的对象仍是同一个:

    public class EnumTest {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            SingleEnum singleBean = SingleEnum.INSTANCE;
            SingleEnum singleBean2 = null;
            singleBean.setContent("单例,你好");
            System.out.println("实例化前的内容为"+singleBean.getContent());
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("singlebean.obj"));
            objectOutputStream.writeObject(singleBean);
            objectOutputStream.flush();
            FileInputStream fileInputStream = new FileInputStream("singlebean.obj");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            singleBean2 = (SingleEnum) objectInputStream.readObject();
            System.out.println("实例化后的内容为:"+singleBean2.getContent());
            Boolean flag = singleBean == singleBean2;
            System.out.println("是否相等:"+ flag);
    
        }
    }

    运行结果:

  • 相关阅读:
    Java中String类两种实例化的区别(转)
    Linux内核如何装载和启动一个可执行程序(转)
    CentOS 7 下安装jdk1.8(转)
    MySQL中死锁(转)
    CTF取证方法大汇总,建议收藏!
    实战经验|大神战队都在i春秋教你打CTF
    CTF丨从零开始搭建WEB Docker靶场
    业务逻辑漏洞探索之敏感信息泄露
    实战经验丨业务逻辑漏洞探索之活动类漏洞
    漏洞经验分享丨Java审计之XXE(下)
  • 原文地址:https://www.cnblogs.com/kongieg/p/12492372.html
Copyright © 2011-2022 走看看