Java单例设计模式的理解与常规实现方式
1:Java中单例模式是一种常见的设计模式,单例模式有以下特点:
单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
2:java中单例模式的写法也有很多种,我在这里列举几张常用的方式:
1、饿汉式,线程安全 但效率比较低:
/**
- 单例模式的实现:饿汉式,线程安全 但效率比较低
*/
public class SingletonTest {
// 定义一个私有的构造方法 private SingletonTest() { } // 将自身的实例对象设置为一个属性,并加上static和final修饰符 private static final SingletonTest instance = new SingletonTest(); // 静态方法返回该类的实例 public static SingletonTest getInstancei() { return instance; }
}
2、懒汉式,非线程安全:
/**
- 单例模式的实现:懒汉式,非线程安全
- */
public class SingletonTest {
// 定义私有构造方法(防止通过 new SingletonTest()去实例化) private SingletonTest() { } // 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字) private static SingletonTest instance; // 定义一个静态的方法(调用时再初始化SingletonTest,但是多线程访问时,可能造成重复初始化问题) public static SingletonTest getInstance() { if (instance == null) instance = new SingletonTest(); return instance; }
}
3、懒汉式,线程安全简单实现 :
/**
- 单例模式的实现:懒汉式,线程安全简单实现
- */
public class SingletonTest {
// 定义私有构造方法(防止通过 new SingletonTest()去实例化) private SingletonTest() { } // 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字) private static SingletonTest instance; // 定义一个静态的方法(调用时再初始化SingletonTest,使用synchronized 避免多线程访问时,可能造成重的复初始化问题) public static synchronized SingletonTest getInstance() { if (instance == null) instance = new SingletonTest(); return instance; }
}
4、线程安全 并且效率高 单例模式最优方案
/**
- 单例模式最优方案
- 线程安全 并且效率高
- */
public class SingletonTest {
// 定义一个私有构造方法 private SingletonTest() { } //定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用) private static volatile SingletonTest instance; //定义一个共有的静态方法,返回该类型实例 public static SingletonTest getIstance() { // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率) if (instance == null) { //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建) synchronized (SingletonTest.class) { //未初始化,则初始instance变量 if (instance == null) { instance = new SingletonTest(); } } } return instance; }
}
5、静态内部类方式
/**
- 静态内部类方式
*
*/
public class Singleton {
private static class SingletonTest { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonTest.INSTANCE; }
}
以上单例如设计模式即使有多重检查锁也可以通过反射破坏单例
6、目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,因为JVM会保证enum不能被反射并且构造器方法只执行一次,事例如下:
/**
- 使用枚举的单例模式
* - @author uu
*/
public class EnumSingleton{
private EnumSingleton(){} public static EnumSingleton getInstance(){ return Singleton.INSTANCE.getInstance(); } private static enum Singleton{ INSTANCE; private EnumSingleton singleton; //JVM会保证此方法绝对只调用一次 private Singleton(){ singleton = new EnumSingleton(); } public EnumSingleton getInstance(){ return singleton; } }
public static void main(String[] args) {
EnumSingleton obj0 = EnumSingleton.getInstance(); EnumSingleton obj1 = EnumSingleton.getInstance(); //输出结果:obj0==obj1?true System.out.println("obj0==obj1?" + (obj0==obj1));
}
}
在此浅谈一下个人理解,希望对大家有所帮助。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
12月20日云栖精选夜读 | 阿里重磅开源Blink:为什么我们等了这么久?
阿里巴巴计算平台事业部研究员蒋晓伟深入分享Flink和Blink的关系以及未来发展。推荐阅读。 热点热议 阿里重磅开源Blink:为什么我们等了这么久? 作者:阿里云头条 Alibaba Cluster Data 开放下载:270 GB 数据揭秘你不知道的阿里巴巴数据中心 作者:技术小能手发表在:阿里系统软件技术 阿里云数据库技术沙龙 云原生数据库POLARDB核心技术分享 作者:技术小能手 知识整理 Pytorch入门演练 作者:技术小能手发表在:磐创AI 应用基础框架全面解析 作者:技术小能手发表在:EAWorld 直播间搭建项目——延续直播发展趋势 作者:v_acwhr 如何在分组报表中实现组内数据补空行及组内页码 作者:飘然轻落 GAN是一种特殊的损失函数? 作者:【方向】发表在:翻译小组 美文回顾 TensorFlow量化训练 作者:烁凡 如何部署自己的SSD检测模型到Android TFLite上 作者:烁凡 教程:使用Data Lake Analytics读/写MongoDB数据 作者:xumingmingv SSM环境搭建 作者:一默_l 玩转数据显示设置 作者:飘然轻...
- 下一篇
Python 文档,给自己的程序写文档
文档,这个词语在经常在程序员的嘴里冒出来,有时候他们还经常以文档有没有或者全不全为标准来衡量一个软件项目是否高大上。那么,软件中的文档是什么呢?有什么要求呢?python文档又是什么呢?文档有什么用呢? 文档,说白了就是用word(这个最多了)等(注意这里的等,把不常用的工具都等掉了,包括我编辑文本时用的vim工具)文本编写工具写成的包含文本内容但不限于文字的文件。来一个更让人信服的定义,当然是来自维基百科。 软件文档或者源代码文档是指与软件系统及其软件工程过程有关联的文本实体。文档的类型包括软件需求文档,设计文档,测试文档,用户手册等。其中的需求文档,设计文档和测试文档一般是在软件开发过程中由开发者写就的,而用户手册等非过程类文档是由专门的非技术类写作人员写就的。 早期的软件文档主要指的是用户手册,根据Barker的定义,文档是用来对软件系统界面元素的设计、规划和实现过程的记录,以此来增强系统的可用性。而Forward则认为软件文档是被软件工程师之间用作沟通交流的一种方式,沟通的信息主要是有关所开发的软件系统。Parnas则强调文档的权威性,他认为文档应该提供对软件系统的精确描述。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16