如何破坏单例?我说了好几种方式,面试官:你真会?

手撕单例的5种写法! 单例模式在Java中看似简单却暗藏玄机,不当实现可能导致线程安全、反射攻击和序列化破坏等问题。文章详细对比了五种实现方式: 饿汉式:线程安全但资源浪费 懒汉式(非安全):性能高但线程不安全 懒汉式(同步):线程安全但性能低下 双重检查锁:平衡性能与线程安全 静态内部类:优雅实现延迟加载 枚举单例:终极方案,天然防御反射和序列化攻击 性能测试显示,静态内部类和枚举单例表现最优。生产推荐:小型工具用饿汉式,分布式系统用静态内部类,高安全场景用枚举单例。需警惕反射攻击和序列化破坏的风险。 阅读详情

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。是一种创建型设计模式。他的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式一般体现在类声明中,单例的类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

但是其实,单例并不是完完全全安全的,也是有可能被破坏的。

以下,是一次面试现场的还原,之所以会聊到这个话题,是因为面试官问了我很多关于单例模式的问题,我回答的还可以,之后面试官随口问了一句"单例绝对安全吗?",紧接着发生了如下对话:

Q:单例模式绝对安全吗?

A:(这个问题我知道,别想难倒我)不一定的,其实单例也是有可能被破坏的?

Q:哦?怎么说?

A:单例模式其实是对外隐藏了构造函数,保证用户无法主动创建对象。但是实际上我们是有办法可以破坏他的。

Q:那你知道有什么办法可以破坏单例吗??

A:有一个比较简单的方式,那就是反射。

反射破坏单例

我们先来一个比较常见的单例模式:

import java.io.Serializable;
/**
 * 使用双重校验锁方式实现单例
 */
public class Singleton implements Serializable{
    private volatile static Singleton singleton;
    private Singleton (){}
    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

这个单例模式提供了一个private类型的构造函数,正常情况下,我们无法直接调用对象的私有方法。但是反射技术给我们提供了一个后门。

如下代码,我们通过反射的方式获取到Singleton的构造函数,设置其访问权限,然后通过该方法创建一个新的对象:

import java.lang.reflect.Constructor;
public class SingletonTest {

    public static void main(String[] args) {
        Singleton singleton = Singleton.getSingleton();
        try {
            Class<Singleton> singleClass = (Class<Singleton>)Class.forName("com.dev.interview.Singleton");

            Constructor<Singleton> constructor = singleClass.getDeclaredConstructor(null);

            constructor.setAccessible(true);

            Singleton singletonByReflect = constructor.newInstance();

            System.out.println("singleton : " + singleton);
            System.out.println("singletonByReflect : " + singletonByReflect);
            System.out.println("singleton == singletonByReflect : " + (singleton == singletonByReflect));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出结果为:

singleton : com.dev.interview.Singleton@55d56113
singletonByReflect : com.dev.interview.Singleton@148080bb
singleton == singletonByReflect : false

如上,通过发射的方式即可获取到一个新的单例对象,这就破坏了单例。

Q:那这种破坏单例的情况,有办法避免吗?

A:其实是可以的,只要我们在构造函数中加一些判断就行了。

如下方式,我们在Singleton的构造函数中增加如下代码:

private Singleton() {
    if (singleton != null) {
        throw new RuntimeException("Singleton constructor is called... ");
    }
}

这样,在通过反射调用构造方法的时候,就会抛出异常:

Caused by: java.lang.RuntimeException: Singleton constructor is called...

序列化破坏单例

Q:嗯嗯,挺不错的,那我们换个问题吧。

A:(这部分面试官在犹豫问我什么问题,我主动提醒了他一句)其实,除了反射可以破坏单例,还有一种其他方式也可以的。

Q:嗯,那你就说说还有什么方式吧

A:其实通过序列化+反序列化的方式也是可以破坏单例的。

如以下代码,我们通过先将单例对象序列化后保存到临时文件中,然后再从临时文件中反序列化出来:

public class SingletonTest {

    public static void main(String[] args) {
        Singleton singleton = Singleton.getSingleton();

        //Write Obj to file
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
            oos.writeObject(singleton);
            //Read Obj from file
            File file = new File("tempFile");

            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
            Singleton singletonBySerialize = (Singleton)ois.readObject();
            //判断是否是同一个对象

            System.out.println("singleton : " + singleton);
            System.out.println("singletonBySerialize : " + singletonBySerialize);
            System.out.println("singleton == singletonBySerialize : " + (singleton == singletonBySerialize));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出结果如下:

singleton : com.dev.interview.Singleton@617faa95
singletonBySerialize : com.dev.interview.Singleton@5d76b067
singleton == singletonBySerialize : false

如上,通过先序列化再反序列化的方式,可获取到一个新的单例对象,这就破坏了单例。

因为在对象反序列化的过程中,序列化会通过反射调用无参数的构造方法创建一个新的对象,所以,通过反序列化也能破坏单例。

Q:那这种破坏单例的情况,也同样有办法避免吗?

A:当然也有了。只要修改下反序列化策略就好了。

只需要在Sinleton中增加readResolve方法,并在该方法中指定要返回的对象的生成策略几可以了。即序列化在Singleton类中增加以下代码即可:

private Object readResolve() {
    return getSingleton();
}

Q:为什么增加readResolve就可以解决序列化破坏单例的问题了呢?

A:因为反序列化过程中,在反序列化执行过程中会执行到ObjectInputStream#readOrdinaryObject方法,这个方法会判断对象是否包含readResolve方法,如果包含的话会直接调用这个方法获得对象实例。

Q:那如果没有readResolve方法的话,反序列化的时候会怎么创建对象呢?

A:当然也是反射咯。

Q:那前面不是说使用反射的情况,直接在构造函数抛异常不就行了吗?

A:这个我还真试过,其实是不行的,反序列化使用的反射构造器和我们代码中使用反射的构造器不是同一个,反序列化用到的构造器并不会调用到我们对象中的构造函数…balabala…(我也不知道面试官听不听得懂,感觉是没听懂…)

Q:哦。OK吧,请问你什么时候可以来上班?

不久之后,我入职了这家公司,在一次和当初的面试官聊天的时候,他无意间和我说:当时我面试你的时候,关于单例的破坏那几个问题,其实最开始我只是随口一问,没想到你给我吹水了20分钟…当时我就觉得你这家伙是个可造之材。

随口一问…

 

Java高频面试基础问题与知识点整理 Java高频面试知识点总结:覆盖高频基础知识考点+高频集合知识点深入分析+高频多线程与并发编程面试题汇总+其他扩展考察等。 阅读详情

相关推荐

c语言【分糖果】2023蓝桥杯4124(枚举,递归,dfs)

但是这是不符合我们糖果刚好分完的条件的,我们应该往回退到上一层,也就是孩子6这层,然后j+1=3,孩子7分到3个第二种糖果,这也不符合我们糖果刚好分完的条件,然后就会再次回退到孩子6这里,然后j+1=4,让我们的孩子7获得5块第二种糖果,然后还是不符合糖果刚分完的条件,于是再一次退回到孩子6这里,然后就会有外循环i+1=1,j=1,孩子7分到1块第一种糖果1块第二块糖果......然后就是这样的不停地回溯,试探,直到把整棵树遍历一遍,并且记录所有的满足条件的组合。先放一下我的代码,我的代码超时啦救命!

weixin_74331419的博客 732

单例模式对象销毁

std::mutex resource_mutex; class MyCAS // 这是一个单例类 { private: MyCAS() {}//私有化构造函数 private: static MyCAS* m_instance;//静态成员变量 public: static MyCAS* getInstance() { if (m_instance == nullptr) { std::uniqu.

qq_34754747的博客 2863

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通过在每个连杆上建立坐标系,并利用齐次坐标变换来实现连杆之间的坐标转换。通过依次变换,可以推导出末端执行器相对于基坐标系的位姿,从而建立机器人的运动学方程。以IRB4600型六自由度工业机械臂为例,选择标准DH建模方法,建立其正运动学模型。

chen_mp的博客 1万+

单例模式&破坏单例模式

百度百科: 单例模式,属于的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)单例模式最早定义出现于《设计模式》(爱迪生威斯理 1994):保证一个类仅有一个实例,并提供一个它的全局访问点Java中单例模式定义:一个类仅有一个实例,并自行实例化向整个系统提供。

yuqu1028的博客 966

高通9008模式隐藏技巧:不拆机用ADB命令+Diag协议进入EDL

本文深入解析高通EDL模式(紧急下载模式)的技术原理与实战应用,详细介绍了通过ADB命令和Diag协议无需拆机进入EDL的方法。涵盖硬件/软件触发方案、跨平台工具配置、Firehose协议解析及设备救砖流程,为开发者提供从基础到进阶的完整指南。

weixin_29191761的博客 1130

人工智能训练师三级·模型生命周期真题40题|训练→评估→调优全链路通关

本文为人工智能训练师三级考试真题解析系列第2篇,聚焦模型生命周期全链路(训练→评估→调优)。内容包含40道精选真题,覆盖数据划分、模型训练、评估指标、超参数调优4个核心阶段。重点考察:1)数据集的合理划分方法(留出法、交叉验证);2)模型训练的基本原理;3)关键评估指标(准确率、召回率、F1等)的应用场景;4)超参数调优技术(网格搜索、随机搜索等)。通过真题解析帮助考生系统掌握模型生命周期的闭环迭代方法论,提升从数据准备到模型优化的全流程实践能力。适合备考人工智能训练师三级认证的考生学习参考。

白话机器学习 90

关于“如何破坏单例“我说了好几种方式,面试官却说:我其实随便问问,没想到你真会

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。是一种创建型设计模式。他的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式一般体现在类声明中,单例的类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 但是其实,单例并不是完完全全安全的,也是有可能被破坏的。 以下,是一次面试现场的还原,之所以会聊到这个话题,是因为面试官问了我很多关于单例模式的问题,我回答的还可以,之

勇往直前的专栏 805

【C#程序员入门AI】AI应用的操作系统:Semantic Kernel 2026实战

用户ID用户信息

人工智能AI技术 1251

破坏单例模式的三种方式

单例模式的定义: 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。 在java中,单例模式我们常用的有三种(不晓得哪个天杀的说有七种,我懒得去找……) 其实,我们在日常的应用中,会遇到这么一些问题:单例模式是怎么被破坏的?单例模式无坚不摧到底好不好?单例模式既然会被破坏有没有办...

天高任鸟飞,海阔凭鱼跃 2969

【2025国赛A题】A题烟幕干扰弹的投放策略思路+代码+论文

【2025国赛A题】A题烟幕干扰弹的投放策略思路+代码+论文

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 867

自动驾驶算法/规划决策控制算法面经汇总、学习路线、面经心得

自动驾驶算法学习路线,面试求职大全

qq_41667348的博客 1万+

如何破坏单例模式?

所谓单例模式就是,某一个类只有一个实例,实现的核心就是将类的构造函数私有化, 只能由该类创建对象,其他对象就不能调用该类的构造函数,既不能创建对象。如何破坏单例?思考破坏单例之前,分析一个问题: 对象的创建方式有哪几种?四种: new、克隆、序列化、反射。标题可以改为:……其他对象就不能调用该类的构造函数,即不能通过new 来创建对象了。那么是否还有可以通过其他的三种方式创建对象呢,即其他三种方式

Android成长日记 555

【OpenClaw企业级智能体实战】第16篇:电商“龙虾”掘金记:用OpenClaw实现小红书/抖音/淘宝全自动矩阵运营(2026实测版)

2026年,OpenClaw(小龙虾)已成为电商运营的核心效率工具——从公众号文案3分钟生成到TikTok爆款视频1小时复刻,从多平台内容同步到自动比价加购,彻底重构了电商运营的工作模式。本文基于真实商业案例(元岳科技、TikTok跨境卖家、淘宝MCP工具),系统拆解电商智能体的落地路径:先详解OpenClaw在电商场景的核心原理与变现模式(代部署、模板售卖、轻定制、内容套利),再提供阿里云/本地双部署方案,完整实现小红书/抖音/淘宝的自动化运营(热点抓取、内容生成、多平台分发、数据分析)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2294

关于"如何破坏单例"我说了好几种方式,面试官却说:我其实随便问问,没想到你真会...

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。是一种创建型设计模式。他的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式一般体...

HollisChuang's Blog 1202

深度学习工具包 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")

蓝牙模块HM-10手册

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

关于如何破坏单例的几种方式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。是一种创建型设计模式。他的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式一般体现在类声明中,单例的类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 但是其实,单例并不是完完全全安全的,也是有可能被破坏的。 以下,是一次面试现场的还原,之所以会聊到这个话题,是因为面试官问了我很多关于单例模式的问题,我回答的还可以,之

tyrroo的博客 1084

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

面试官看完我手写的单例直接惊呆了!

前言 单例模式应该算是 23 种设计模式中,最常见最容易考察的知识点了。经常会有面试官让手写单例模式,别到时候傻乎乎的说我不会。 之前,我有介绍过单例模式的几种常见写法。还不知道的,传送门看这里: 设计模式之单例模式 本篇文章将展开一些不太容易想到的问题。带着你思考一下,传统的单例模式有哪些问题,并给出解决方案。让面试官眼中一亮,心道,小伙子有点东西啊! 以下,以 DCL 单例模式为例。 DCL 单例模式 DCL 就是 Double Check Lock 的缩写,即双重检查的同步锁。代码如下, public

烟雨星空的博客 677

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

如何破坏单例

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。是一种创建型设计模式。他的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式一般体现在类声明中,单例的类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 但是其实,单例并不是完完全全安全的,也是有可能被破坏的。 以下,是一次面试现场的还原,之所以会聊到这个话题,是因为面试官问了我很多关于单例模式的问题,我回答的还可.

SmileTimLi的博客 334

揭秘单例的破解之道:几种实用的破坏方法

这个我还真试过,其实是不行的,反序列化使用的反射构造器和我们代码中使用反射的构造器不是同一个,反序列化用到的构造器并不会调用到我们对象中的构造函数…不久之后,我入职了这家公司,在一次和当初的面试官聊天的时候,他无意间和我说:当时我面试你的时候,关于单例的破坏那几个问题,其实最开始我只是随口一问,没想到你给我吹水了20分钟…以下,是一次面试现场的还原,之所以会聊到这个话题,是因为面试官问了我很多关于单例模式的问题,我回答的还可以,之后面试官随口问了一句"单例绝对安全吗?但是实际上我们是有办法可以破坏他的。

Reische的博客 253

面试官问你单例设计模式,问问自己你真的了解单例吗?小单例,不简单!

也许你所了解的单例设计模式就是那几种单例的用法。序列化攻击、反射攻击、手动实现和底层防止攻击、几种单例的演变过程以及优缺点你是时候了解下了。在这里,我会带你一步步深入了解单例,秒杀面试!

奈何的人生 5058

单例模式的挑战:如何巧妙地破解单例

这个我还真试过,其实是不行的,反序列化使用的反射构造器和我们代码中使用反射的构造器不是同一个,反序列化用到的构造器并不会调用到我们对象中的构造函数…不久之后,我入职了这家公司,在一次和当初的面试官聊天的时候,他无意间和我说:当时我面试你的时候,关于单例的破坏那几个问题,其实最开始我只是随口一问,没想到你给我吹水了20分钟…以下,是一次面试现场的还原,之所以会聊到这个话题,是因为面试官问了我很多关于单例模式的问题,我回答的还可以,之后面试官随口问了一句"单例绝对安全吗?但是实际上我们是有办法可以破坏他的。

资料免费分享,点击名片 98

java 单例 线程阻塞_面试官真是搞笑!让实现线程安全的单例,又不让使用synchronized...

首先对单例模式做个简单的介绍:单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯...

weixin_34794420的博客 152

面试官:请写一个你认为比较“完美”的单例

单例模式是保证一个类的实例有且只有一个,在需要控制资源(如数据库连接池),或资源共享(如有状态的工具类)的场景中比较适用。如果让我们写一个单例实现,估计绝大部分人都觉得自己没问题,但如果需要实现一个比较完美的单例,可能并没有你想象中简单。本文以主人公小雨的一次面试为背景,循序渐进地讨论如何实现一个较为“完美”的单例。本文人物与场景皆为虚构,如有雷同,纯属捏造。 小雨计算机专业毕业三年,对设计模式略有涉猎,能写一些简单的实现,掌握一些基本的JVM知识。在某次面试中,面试官要求现场写代码:请写一个你认为比较“完

半路雨歌 1592

这怕是最全的【单例模式】,可以拉着面试官掰扯半小时(面试必备)

外链图片转存中…(img-Y5S2pDCF-1714809115177)]

2401_84004024的博客 680

面试官说你的单例线程不安全,你真能现场修好?

单例模式可能是面试出现频率最高的设计模式,没有之一。但多数人只会背饿汉式和双重检查锁,被追问一句"为什么 volatile""为什么两次判空"就懵了。更惨的是,有些人在面试里写的单例代码本身就是错的——不是忘了 volatile,就是双重检查锁写成了单次检查。这篇文章把单例在多线程下的所有坑和修法讲清楚,面试再被问到,你可以反过来问面试官。

2401_89221867的博客 218
上一篇: 看完这些 Java 代码优秀案例,一定对你有提升
下一篇: 一口气说出 6种 延时队列的实现方案
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值