本文意在和谐讨论,高手勿喷~
单例模式容易忽略的几点:
1.第三种单例实现(除了懒汉和饿汉)
2.构造函数私有化(单例的核心)
3.即便构造函数私有化了也不能保证只有一个实例
下面我们来详细阐述:
1.第三种单例实现(除了懒汉和饿汉)
- 饿汉模式无论你是否会用到,上来都会创建实例。
- 懒汉模式只有在用到的时候才会创建,但是为了不产生多线程的问题,需要加synchronized来保证线程安全,但是每次使用的时候都需要带着保证线程安全的操作,无形增加了系统的开销.
于是使用第三种方式(内部类方式)来同时解决懒汉和恶汉的弊端
package com.cxy.singleton; /** 内部类方式 * @author cxy */ public class InnerClassSingleton { //私有构造子 (保证整个系统只有一个实例) private InnerClassSingleton(){ System.out.println("InnerClassSingleton 实例化"); } //内部类 private static class SingletonHolder { private static InnerClassSingleton instance = new InnerClassSingleton(); } public static InnerClassSingleton getInstance() { return SingletonHolder.instance; } }
2.构造函数私有化(单例的核心)
为了保证整个系统只有一份实例,我们使用构造函数私有化的方式来保证,系统不会new出第二个实例。
3.即便构造函数私有化了也不能保证只有一个实例
其实即便构造函数私有化了,我们还是可以通过反射的方法来new出第二份实例的。
package com.cxy.singleton; import java.lang.reflect.Constructor; import org.junit.Test; public class DestroyTest { @Test public void test() throws Exception { HungrySingleton obj1=HungrySingleton.getInstance(); HungrySingleton obj2=HungrySingleton.getInstance(); System.out.println("obj1和obj2是否相等:"+(obj1==obj2)); System.out.println("====================="); //通过构造方法赋权限 让私有构造函数 可以实例化 HungrySingleton obj3=null; HungrySingleton obj4=null; Constructor[] cons = Class.forName("com.cxy.singleton.HungrySingleton").getDeclaredConstructors(); if(cons.length==1) { cons[0].setAccessible(true); obj3=(HungrySingleton)cons[0].newInstance(); obj4=(HungrySingleton)cons[0].newInstance(); } System.out.println("obj3和obj4是否相等:"+(obj3==obj4)); } }
如果你还知道有什么其他的关于单例"不为人知"的信息,欢迎指教讨论~
转载请保留原文地址!
相关推荐
单例模式单例模式单例模式单例模式单例模式单例模式单例模式单例模式
C#单例模式C#单例模式详解C#单例模式详解C#单例模式详解
单例模式详解~~单例模式详解~~单例模式详解~~
几种单例模式的书写方式
php单例模式php单例模式php单例模式php单例模式
Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式...
2020-02-10 王争设计模式之美进入课程讲述:冯永吉时长 10:21大小 8.31M上两节课中,我们针对单例模式,讲解了单例的应用场景、几种常见的代码实现
这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看
一个简单的java工程,包含注释,一目了然,其中包含了单例模式的所有实现方式,懒汉式,饿汉式,双重校验,枚举,静态内部类等方式实现单例。
单例模式--只能弹出一个窗体 只能弹出一个窗体
单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...
设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试
单例模式和工厂模式结合应用,实现了产品的生产,适合用做课程设计,包含详细文档和代码。Java语言。喜欢的可以下载来看看那
首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述
java Singleton单例模式 java Singleton单例模式
单例模式的七种实现方法以及分析,可以作文大作业提交 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 2.2IDEA简介 4 3. 单例模式的7种实现方式 5 3.1饿汉式(使用静态常量...
设计模式C++学习之单例模式(Singleton)
单例模式,您能写出几个呢?这个PPT将为你全面阐述5种不同形式的单例模式。
研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式
java单例模式的实现方式