【Java进阶营】Java 序列化 之 单例模式

Java单例模式的序列化问题及处理方法 本文的目的是深入剖析Java单例模式在序列化场景下遇到的问题,并提供切实可行的解决办法。范围涵盖了单例模式和序列化的基本概念、问题产生的原理、代码示例以及处理方案。本文首先会介绍单例模式和序列化的核心概念,然后分析它们之间的联系以及单例模式序列化问题产生的原因,接着通过代码实例展示问题,最后给出处理方法,并对未来可能的发展趋势进行探讨。单例模式:一种设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。序列化:将对象转换为字节流的过程,以便在网络上传输或存储到文件中。反序列化。 阅读详情

当我们使用Singleton模式时,应该是期望某个类的实例应该是唯一的,但如果该类是可序列化的,那么发序列化后还会是单例的吗?下面我们通过如下示例一来验证一下:

示例一
User 类
User 类是单例模式,使用的饿汉模式,在类加载的时候就创建对象实例。

public class User implements Serializable {
private static final long serialVersionUID = 3380014540967816490L;

private String userName;
private String password;

private static User user = new User("zhangsan", "test");

private User(String userName, String password) {
    this.userName = userName;
    this.password = password;
}
public static User getInstance() {
    return user;
}
public String getUserName() {
    return userName;
}
public String getPassword() {
    return password;
}

Test 类
测试类,把 User 的单例实例序列化后在反序列化

public class Test{
public static void main(String[] args) throws Exception {
File file = new File(“d:\a.user”);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(User.getInstance());

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
    User user = (User) ois.readObject();
    System.out.println(user);

    if(user==User.getInstance()){
        System.out.println("同一个实例");
    }else{
        System.out.println("不同的实例");
    }
}

}

执行结果如下:

输出的结果:
User [userName=zhangsan, password=123456]
不同的实例

通过结果可以看出,单例模式的饿汉模式也无法确保对象实例是单例的。

那么我们应该怎么解决这个问题呢?

readResolve() 方法
public class User implements Serializable {

private static final long serialVersionUID = 3380014540967816490L;

private String userName;
private String password;

private static User user = new User("zhangsan", "123456");

private User(String userName, String password) {
    this.userName = userName;
    this.password = password;
}
public static User getInstance() {
    return user;
}
public String getUserName() {
    return userName;
}
public String getPassword() {
    return password;
}
public Object readResolve(){
    return getInstance();
}
@Override
public String toString() {
    return "User [userName=" + userName + ", password=" + password + "]";
}

}
我们在 User 类中添加了一个 readResolve() 方法,该方法直接返回单例中的示例。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
然后在执行 Test.main() 方法
执行结果如下:

输出的结果:
User [userName=zhangsan, password=123456]
相同的实例

无论是实现Serializable接口,或是Externalizable接口,当从I/O流中读取对象时,readResolve()方法都会被调用到。实际上就是用readResolve()中返回的对象直接替换在反序列化过程中创建的对象。

Java单例模式:序列化与反序列化的坑 本文聚焦Java单例模式在**序列化(Serialization)和反序列化(Deserialization)**场景下的“失效问题”。解释为什么序列化会破坏单例模式;用代码演示“单例被反序列化后变多例”的现象;提供3种修复方案(含JDK官方推荐方案);总结不同单例实现方式的序列化安全性。本文从单例模式的基础讲起,逐步引入序列化概念,通过“问题演示→原理分析→解决方案”的逻辑展开,最后总结最佳实践。即使你对序列化完全陌生,也能跟着步骤理解。 阅读详情

相关推荐

Java:使用Java调用打印机进行打印(JPG、PDF和Word三种文件格式)

目录 一、Java的打印简介 二、Java打印实现 2.1 JPG图片文件格式打印实现 2.2 PDF文件格式打印实现 2.3 Word文件格式打印实现 2.3.1 Word文件采用jacob插件进行打印实现。 2.3.2 先将word转化为pdf文件,然后打印pdf(lz使用) 三、总结 一、Java的打印简介 在我们的实际工作中,经常需要实现打印功能。但由于历史原因,Jav...

vatxiongxiaohui的专栏 8万+

【Java设计模式】单例模式与序列化

序列化会破坏单例模式 当使用双重校验锁并且使用了volatile的时候,这种看上去非常perfect的方式也可能存在单例模式被破坏的问题,那就是遇到序列化的时候。 Q:序列化之后的对象还是同一个吗 答案是 不是 public class Singleton implements Serializable{ private volatile static Singleton singleton; private Singleton (){} public static Singleto

qq_45461593的博客 478

无人机飞控技术最详细解读

已剪辑自: https://zhuanlan.zhihu.com/p/64519280[导读]被称作是“飞行器的大脑”的飞控到底是什么?以前,搞无人机的十个人有八个是航空、气动、机械出身,更多考虑的是如何让飞机稳定飞起来、飞得更快、飞得更高。如今,随着芯片、人工智能、大数据技术的发展,无人机开始了智能化、终端化、集群化的趋势,大批自动化、机械电子、信息工程、微电子的专业人材投入到了无人机研发大潮中,几年的时间让无人机从远离人们视野的军事应用飞入了寻常百姓家、让门外汉可以短暂的学习也能稳定可靠的飞行娱乐。不可

qq_41854911的博客 1万+

Java 序列化 之 单例模式

序列化相关文章: * Java 序列化 之 Serializable * Java 序列化之 Externalizable 当我们使用Singleton模式时,应该是期望某个类的实例应该是唯一的,但如果该类是可序列化的,那么发序列化后还会是单例的吗?下面我们通过如下示例一来验证一下: 示例一 User 类 User 类是单例模式,使用的饿汉模式,在类加载的时候就创建对象实例。...

jijianshuai的专栏 2711

【无标题】EXCEL实现刷题

运用Excel开发的刷题工具,具有普遍实用性,可将WORD的试题自动导入并实现刷题。

weixin_44081794的博客 2971

如何利用 多 张 GPU 高效运行 Ollama

通过以上步骤,我们可以确保系统尽可能地利用所有 多张GPU 来运行 Ollama。如果在配置过程中遇到问题,建议查阅 Ollama 的官方文档,确认其是否支持多 GPU 并行计算,或者对系统性能进行进一步的优化。充分利用多 GPU 的并行计算能力,可以显著提升 Ollama 的运行效率,加快模型的推理和训练速度。希望本文能帮助你顺利实现 多张 GPU 的高效利用。

weixin_44997264的博客 8031

java学习--day24(单例模式&序列化&Lambda表达式)

类 ObjectInputStream(反序列化) 和 ObjectOutputStream(序列化) 是高层次的数据流,它们包含反序列化和序列化对象的方法。总结:序列化能干嘛?将一个类对象信息(构造方法,属性,方法)可以写到本地一个文件中。上面的方法序列化一个对象,并将它发送到输出流。它的返回值为Object,因此,你需要将它转换成合适的数据类型。总结:序列化将对象的值存到本地磁盘的文件中以作备份。反序列化可以将本次磁盘序列化过的文件读取到实体类的对象中。将本地的文件信息(被序列化过的)写到一个对象中。

weimingchao的博客 691

YOLOv11改进 | 检测头篇 | 利用AFPN辅助YOLOv11检测头进行特征融合识别(全网独家创新)

本文给大家带来的最新改进机制是利用AFPN(渐近特征金字塔网络)来优化检测头,AFPN的核心思想是通过引入一种渐近的特征融合策略,将底层、高层和顶层的特征逐渐整合到目标检测过程中。这种渐近融合方式有助于减小不同层次特征之间的语义差距,提高特征融合效果,使得检测模型能更好地适应不同层次的语义信息。本文在AFPN的结构基础上,为了适配YOLOv11改进AFPN结构,同时将AFPN融合到YOLOv11中(因为AFPN需要四个检测头,我们只有三个,下一篇文章我会出YOLOv11适配AFPN增加小目标检测头)

Snu77的博客 3751

单例模式在序列化场景下实现

这里写自定义目录标题单例模式在序列化场景下实现 单例模式在序列化场景下实现 单例有懒汉,饿汉,双重锁,静态内部类,枚举类 单例的要求:构造私有,序列化反序列化唯一,线程实例唯一 一般的单例类尽管构造方法私有,但在序列化再反序列化时,会通过反射调用对象的构造方法,造成单例对象的不唯一 故而在序列化反序列化时,单例类必须提供一个方法readResolve 返回值为单例实例 code: 单例类: pub...

white_while的博客 345

【软考高级架构】论文范文12——论生成式AI在软件开发中的应用与挑战

随着生成式AI技术的跨越式发展,以大语言模型为代表的生成式AI正在深刻改变软件开发的传统模式。在代码生成、测试构造、文档编写等环节,生成式AI展现出显著的效率提升潜力,但其应用也面临着代码质量不可控、安全漏洞植入、版权合规等严峻挑战。本文以笔者主导的某大型金融企业智能研发辅助平台建设项目为案例,围绕生成式AI在软件开发中的应用实践与应对挑战的策略展开论述。笔者担任系统架构师,负责平台架构设计、模型选型、质量保障机制及安全防线构建。

qq837993702的博客 275

YOLOv11改进有效涨点专栏目录 | 含卷积、主干、注意力机制、Neck、检测头、损失函数、二次创新C2PSA/C3k2等各种网络结构改进

Hello,各位读者们好.本文为最新YOLOv11有效涨点专栏目录,YOLOv11以及发布了一个月左右,这个过程中我也是给大家整理了许多的机制,其中包含了C3k2、主干(均支持根据yolov11训练的版本进行二次缩放,全系列都能轻量化)、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。

Snu77的博客 8万+

单例模式与序列化那些事

本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。 单例模式,是设计模式中最简单的一种。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。关于单例模式的使用方式,可以阅读单例模式的七种写法 但是,单例模式真的能够实...

编程战五渣 287

Coze智能体开发:扣子空间制作PPT功能

扣子空间内置了丰富的场景模板,涵盖人文历史、学术分享、研究报告、数据分析等场景,可以满足不同用户的需求。 你只需输入与制作 PPT 相关的提示词,Agent 就能基于这些提示词展示思考的过程,并自动生成完整的 PPT。

王国平的博客 2052

Java对象序列化详解

所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。一、定义  序列化:把Java对象转换为字节序列的过程。      反序列化:把字节序列恢复为Java对象的过程。二、用途  对象的序列化主要有两种用途:      1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)      2) 在网络上传送对象的字节序列。(网络传输对象)...

爱雨轩 4万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java设计模式——单例模式之序列化会破坏单例模式及解决方案

一、序列化饿汉式单例模式的示例 1、定义一个饿汉式单例模式并实现序列化接口 package com.rf.designPatterns.singleton.serializeHungrySingleton; import java.io.Serializable; /** * @description: 饿汉式单例模式实现序列化接口 * @author: xiaozhi * @create: 2020-05-24 15:24 */ public class SerializeHungrySingle

小志的博客 1396

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

序列化破坏单例模式以及如何防御的应用与Debug分析

反射、序列化破坏单例模式以及如何防御 需要了解实现单例模式的各种方法,可以参考下方这篇博客。 设计模式-单例模式(Singleton Pattern) 单例模式类Singleton,是使用静态内部类实现的单例模式,并且实现Serializable接口(不实现Serializable接口进行序列化会报错)。 package com.kaven.design.pattern.creational.si...

kaven 4976

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

单例模式被序列化破坏了怎么办

转载自深度解析单例与序列化之间的爱恨情仇 本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。 单例模式,是设计模式中最简单的一种。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。关于单例模式的使用方式,可以...

simple的博客 547

序列化破坏单例模式以及如何防御

序列化介绍 Serializable介绍 如果单例类实现了序列化接口Serializable,那么就可能被序列化攻击来破坏单例模式。 public class Singleton implements Serializable { private static final long serialVersionUID = 1L; private static Singleton singleton = new Singleton(); private Singleton(){

小灰狼与大白兔的博客 6794

使用 `readResolve` 防止序列化破坏单例模式

在 Java 的单例模式中,序列化和反序列化可能会破坏单例的唯一性,而通过方法可以有效防止反序列化生成新对象,从而维护单例模式的约束。使用可以确保反序列化时返回的是现有的单例实例,而不是新的对象。对于需要持久化的单例类来说,这是一个非常重要的防御措施。确保你的单例模式在序列化和反射攻击下都具备防御机制,才能真正做到一个类的实例唯一。

weixin_54574094的博客 1557

如何防止反射机制和序列化反序列化破坏单例模式

前言 上一篇文章介绍了单例模式的几种写法,但是关于单例模式的问题还没有完全说完,今天我们继续介绍通过反射机制和序列化反序列化是如何破坏单例的以及解决方案,阅读本文前需要了解单例模式的几种写法,如果对单例模式的写法不清楚的同学可以参考:单例模式的六种写法 一.如何通过反射机制破坏单例模式 1. 什么是反射机制 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于...

老狼的博客 1472

当单例模式遇到序列化会出现什么问题

什么是单例模式   这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 什么是序列化   简单来说序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O)。我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:...

weixin_30779691的博客 894

一文搞懂JAVA序列化机制

序列化:把Java对象转换为字节序列的过程。反序列化:把字节序列恢复为Java对象的过程。

yang_brother的博客 2282

单例模式学习与进阶

目录 一:单例定义 二:单例实现模式 2.1饿汉模式 2.2 懒汉模式(线程不安全) 2.3懒汉模式(线程安全) 2.4 双重检查模式 (DCL) 2.5静态内部类单例模式 2.6枚举单例 2.7使用容器实现单例模式 三:枚举单例的推荐 3.1 一般单例的缺点 3.2 序列化/反射对枚举的破坏&枚举的优点 3.3 枚举单例示例 四:单例模式的优缺点 ...

许进进的博客 7108

Java 序列化 序列化与单例模式 [ 转载 ]

Java 序列化 序列化与单例模式 [ 转载 ] @authorHollis 本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。 单例模式,是设计模式中最简单的一种。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象...

ddmm2012的博客 195

java中反序列化与单例模式的冲突

今天在序列化反序列化的时候,发现单例模式竟然实现不了, 查了一下资料,发现反序列化由于使用了反射机制来创建一个新的对象, 导致其并没有受到单例模式的约束,今天做一个总结,以便后续查询。 有兴趣的可以从java.io.ObjectInputStream中的public final Object readObject()开始, 看一下jdk的源码: public final Object readObject() throws IOException, ClassNotFoundException {

roddger1的博客 268
上一篇: 【Java进阶营】java实现HTTP请求的三种方式
下一篇: 【Java进阶营】Java中枚举知识点总结
jvm大志
博客等级 码龄5年 3粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值