java单例模式 三种_三种java单例模式概述
在java语言的应用程序中,一个类Class只有一个实例存在,这是由java单例模式实现的。Java单例模式是一种常用的软件设计模式,java单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。下面就来介绍一下这三种java单例模式的相关内容。
java单例模式是一种常见的设计模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例,这也是java单例模式的最主要的作用。单例模式的特点有:(1)单例类只能有一个实例;(2)单例类必须自己创建自己的唯一实例;(3)单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
(1)java单例模式之懒汉式:单例模式的懒汉式体现了缓存的思想,延时加载就是一开始不要加载资源或者数据,一直等,等到马上就要使用这个资源的或者数据了,躲不过去了才去加载。懒汉式是定性的时间换空间,不加同步的懒汉式是线程不安全的。如何实现线程安全的懒汉式(双重检查加锁):
public class Singleton {
private volatile static Singleton instance = null;
// 私有化构造方法
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
(2)java单例模式之饿汉式:对于饿汉模式,我们可以这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。
对比一下懒汉模式和饿汉模式的优缺点:懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源;饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快,它从加载到应用结束会一直占用资源。
这两种模式对于初始化较快,占用资源少的轻量级对象来说,没有多大的性能差异,选择懒汉式还是饿汉式都没有问题。但是对于初始化慢,占用资源多的重量级对象来说,就会有比较明显的差别了。所以,对重量级对象应用饿汉模式,类加载时速度慢,但运行时速度快;懒汉模式则与之相反,类加载时速度快,但运行时第一次获得对象的速度慢。
(3)java单例模式之登记式:在需要的时候通过静态内部类去创建实例。私有静态内部类写法如下:
public class RegisterSingleton {
private RegisterSingleton() {
}
private static RegisterSingleton getInstance() {
return Holder.registerSingleton;
}
private static class Holder {
private static final RegisterSingleton registerSingleton = new RegisterSingleton()}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread (() -> {
System.out.println(RegisterSingleton.getInstance ().hashCode ());
}
}
}
以上就是三种java单例模式的介绍,java单例模式实际中的应用,懒汉会涉及到线程的并发性问题。在实际项目开发中,使用饿汉比较多。单例设计模式是GoF中23种设计模式之一,是使用频率最高的设计模式之一,希望各位java程序员可以通过设计模式的引导,在未来的实际项目开发中逐步融入设计思想,提高自己的java编程能力,同时也使得自己的编程思想进一步升华。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160049.html原文链接:https://javaforall.cn
相关文章
- 做了三年Java,java注释的三种形式
- Java实现单例模式的9种方法
- java单例模式实现-3种方式
- Java的运行机制(一)
- java单例模式——详解JAVA单例模式及8种实现方式
- java三种单例模式的实现[通俗易懂]
- 推荐几个JAVA 学习不错的网站
- java后端知识概述
- java 特点_JAVA的几个重要特点[通俗易懂]
- cglib动态代理实现原理_java设计模式之代理模式
- 【说站】Java反序列化如何理解
- Java栈结构_栈java
- Java实现QQ登录和微博登录
- java虚拟机内存大小_jvm内存分布
- Java html转word_html文件转换成excel
- Headless模式_java策略模式
- Java 中的队列 Queue
- java并发编程(2):Java多线程-java.util.concurrent高级工具
- java中print的用法
- java设计模式之模板模式详解架构师
- 把 Java util.Date 转成 sql.Date详解编程语言
- Java 标准 I/O 介绍详解编程语言
- 玩转Linux:Java开发入门指南(linux上开发java)
- Java连接SQL Server:实现数据库完美对接(java链接sqlserver)
- 基于Java回顾之多线程详解