`
shifulong
  • 浏览: 56472 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单例模式以及序列化仍然单例的问题

    博客分类:
  • java
阅读更多

 

这种方式仍然存在并发的同步阻塞问题,并且jdk1.5之前是有问题的

public class SeriSingleDCL {

    // volatile 多线程并发的可见性
    private volatile static SeriSingleDCL single = null;

    private SeriSingleDCL() {
    }

    /**
     * DCL方式减少同步的阻塞
     */
    public static SeriSingleDCL getInstance() {
        if (single == null) {
            synchronized (SeriSingleDCL.class) {
                if (single == null) {
                    single = new SeriSingleDCL();
                    return single;
                }
            }
        }
        return single;
    }
}

 

 

于是就有了静态内部类的方式&序列化单例问题解决(readResolve方法重写)

public class SeriSingle implements Serializable {

    private static SeriSingle seriSingle;

    /**
     * 被调用的时候才会被加载,实现延迟初始化
     */
    private static class SeriSingleHolder {
        // static jvm保证初始化的多线程可见性
        private static SeriSingle instance = new SeriSingle();
    }

    public static SeriSingle getInstance() {
        return SeriSingleHolder.instance;
    }

    /**
     * 反序列化会调用这个方法,从而保证单例模式的单例性
     * 否则反序列化的时候会生成另一个对象
     */
    private Object readResolve() {
        return SeriSingle.getInstance();
    }
}

class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        File file = new File("/Users/***/test/seritest.obj");

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(SeriSingle.getInstance());
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        SeriSingle readObject = (SeriSingle) ois.readObject();
        ois.close();

        //如果没有实现SeriSingle#readResolve()方法,这将使两个对象
        System.out.println(readObject == SeriSingle.getInstance());
    }
}

  

 

分享到:
评论

相关推荐

    单例模式,single

    在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时如何处理这些缺陷。 单例模式适合于一个类只有一个实例的情况,比如窗口管理器...

    Java单例模式设计

    代码中演示了Java设计模式中的单例模式,其中包括饿汉单例模式,懒汉单例模式以及序列化饭序列化单例模式。在实际的开发中,可以直接借鉴使用。

    7种单例模式

    设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试

    单例模式详解.pdf

    1、掌握单例模式的应用场景。 2、掌握 IDEA 环境下的多线程调试方式。 3、掌握保证线程安全的单例模式策略。 4、掌握反射暴力攻击单例解决方案...5、序列化破坏单例的原理及解决方案。 6、掌握常见的单例模式写法。

    单例模式介绍

    android 六种单例模式源码介绍,反序列化解决方案,编译环境为android studio 3.0.1

    java单例模式完全剖析

    单例模式是最简单的设计模式之一,但是对于Java的开发者来说...在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时如何处理这些缺陷。

    实验12 单例模式与枚举.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java设计模式之单例模式讲解

    入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉...饿汉模式和静态内部类模式如何设置能够避免使用反射方法获取多个实列,以及实现了序列化的类如何避免创建多个实列。

    winform序列化 md5加密 单例模式(无视频).rar

    序列化 md5加密 单例模式(无视频).rar

    单例模式的在调用的时候生成对象(使用内部类) 以及对应的防止序列化导致的不相同

    单例模式的在调用的时候生成对象(使用内部类) 以及对应的防止序列化导致的不相同

    单例设计模式实现总结

    单例模式的总体概述 单例模式,属于创建型模式,《设计模式》一书对它做了定义:保证一个类仅有一个实例,并提供一个全局访问点...防止序列化破坏单例模式 多种实现方式与比较 线程安全的饿汉模式 public class HungryS

    Android编程设计模式之单例模式实例详解

    本文实例讲述了Android编程设计模式之单例模式。分享给大家供大家参考,具体如下: 一、介绍 单例模式是应用最广的模式之一,也可能是很多初级工程师唯一会使用的设计模式。在应用这个模式时,单例对象的类必须保证...

    单例模式的5种设计.docx

    作为一种设计模式,单例模式,可以说的设计模式中比较难的。主要涉及到饿汉模式,懒汉模式,线程安全问题,反射攻击,序列化破坏等。

    Java实验7 序列化.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    【Java设计模式】你对单例模式了解多少,一文深入探究

    目录单例模式懒汉式单例模式未初始化问题解决Double Check 双重检查方案一:不让第二步和第三步重排序-DoubleCheck方案二:基于类初始化-静态内部类饿汉式饿汉式与懒汉式最大区别序列化破坏单例模式原理枚举单例基于...

    单例模式的反射漏洞和反序列化漏洞代码实例

    主要介绍了单例模式的反射漏洞和反序列化漏洞,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    1.设计模式-单例设计模式1

    1.模式定义/应用场景/类图分析 2.字节码知识/字节码指令重排序 3.类加载机制 4.JVM序列化机制 5.单例模式在Spring框架 & JDK源码中的应用

    设计模式——单例实现

    单例的5中实现及反射和反序列化破解单例。

    XStream使用例子

    XStream使用例子,如何序列化、反序列化到XML和JSON格式。

    Java实例高难度面试题及解析 - 展现你的编程实力!

    此外,我们还探讨了对象的哈希码、重写equals()和hashCode()方法的技巧,以及对象的序列化和反序列化。 通过研究和解答这些高难度问题,您将提升自己的编程水平,展现出对Java实例概念和相关技术的深入理解。无论您...

Global site tag (gtag.js) - Google Analytics