首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java单例模式优化写法

Java单例模式优化写法

作者头像
allsmallpig
发布于 2021-02-25 02:34:02
发布于 2021-02-25 02:34:02
26200
代码可运行
举报
文章被收录于专栏:allsmallpi博客allsmallpi博客
运行总次数:0
代码可运行

转载自 http://blog.csdn.net/diweikang/article/details/51354982

Java单例模式优化写法

方法一:推荐

[java] view plain copy

  1. public class SingletonClass {  
  2. private static class SingletonClassInstance {  
  3. private static final SingletonClass instance = new SingletonClass();  
  4.   }  
  5. public static SingletonClass getInstance() {  
  6. return SingletonClassInstance.instance;  
  7.   }  
  8. private SingletonClass() {  
  9.   }  
  10. }  

实际情况是,单例模式使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕。同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题

在这一版本的单例模式实现代码中,我们使用了Java的静态内部类。这一技术是被JVM明确说明了的,因此不存在任何二义性。在这段代码中,因为SingletonClass没有static的属性,因此并不会被初始化。直到调用getInstance()的时候,会首先加载SingletonClassInstance类,这个类有一个static的SingletonClass实例,因此需要调用SingletonClass的构造方法,然后getInstance()将把这个内部类的instance返回给使用者。由于这个instance是static的,因此并不会构造多次。

由于SingletonClassInstance是私有静态内部类,所以不会被其他类知道,同样,static语义也要求不会有多个实例存在。并且,JSL规范定义,类的构造必须是原子性的,非并发的,因此不需要加同步块。同样,由于这个构造是并发的,所以getInstance()也并不需要加同步。

方法二:

[java] view plain copy

  1. public class SingletonTest {    
  2. private static SingletonTest instance = null;    
  3. private SingletonTest() {    
  4.     }    
  5. private static synchronized void syncInit() {    
  6. if (instance == null) {    
  7.             instance = new SingletonTest();    
  8.         }    
  9.     }    
  10. public static SingletonTest getInstance() {    
  11. if (instance == null) {    
  12.             syncInit();    
  13.         }    
  14. return instance;    
  15.     }    
  16. }  
代码语言:javascript
代码运行次数:0
运行
复制

方法三:

[java] view plain copy

  1. public class SingletonClass {  
  2. private static SingletonClass instance = null;  
  3. public static SingletonClass getInstance() {  
  4. if (instance == null) {  
  5. synchronized (SingletonClass.class) {  
  6. if (instance == null) {  
  7.           instance = new SingletonClass();  
  8.         }  
  9.       }  
  10.     }  
  11. return instance;  
  12.   }  
  13. private SingletonClass() {  
  14.   }  
  15. }  
代码语言:javascript
代码运行次数:0
运行
复制

参考:http://devbean.blog.51cto.com/448512/203501/

            http://blog.csdn.net/longyulu/article/details/9159589

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/02/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一、单例模式
解决方案:JVM从内存中反序列化地"组装"一个新对象时,会自动调用类的readResolve方法,我们可以通过此方法返回指定好的对象。
Yuyy
2022/09/21
1930
一、单例模式
《面试季》高频面试题-单例模式的七种写法
   单例模式(Singleton Pattern)是 Java 23种设计模式中最简单的设计模式之一,但是也是面试中出现最频繁的设计模式之一,常见实现方法有:"饿汉式"、"懒汉式",但实际上,它总共有7种写法,要搞懂单例模式,首先要知道它有什么特点,它的特点如下:
IT学习日记
2022/09/13
2500
《面试季》高频面试题-单例模式的七种写法
java设计模式(四)--单例模式
 Singleton最熟悉不过了,下面学习单例模式。转载:http://zz563143188.iteye.com/blog/1847029 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系
Ryan-Miao
2018/03/13
8040
23种设计模式之单例模式进阶
前一篇推文里面我们初步介绍了一下23种设计模式,并且讲解了其中的单例模式的两种情况,今天我们再来讲一讲另外几种单例模式的情况,因为我们都知道懒汉式和饿汉式都有各自的优点和各自的缺点,所以我们今天来讲讲比这两种模式更好的一些方法!
Python进击者
2019/09/17
3340
23种设计模式之单例模式进阶
Java进阶篇设计模式之一 ----- 单例模式
作者:虚无境 链接: https://blog.csdn.net/qazwsxpcm/article/details/80950612 前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个
格姗知识圈
2019/07/19
5080
Java 单例模式
单例模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。 核心知识点如下: (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。 (2) 在其内部产生该类的实例化对象,并将其封装成private static类型。 (3) 定义一个静态方法返回该类的实例。 示例代码: package top.annwz.test; /** * 单例模式 * * Created by huah
用户1180017
2018/06/21
7830
Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)
从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析。
红目香薰
2022/11/29
8420
Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)
Java单例设计模式的理解与常规实现方式
      单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。
动力节点Java培训
2018/12/20
3470
Java单例模式
  单例模式应该是我们接触的众多设计模式中的第一个,但是对于单例模式的一些细节地方对于初学者来说并不是很清楚,所以本文就来整理下单例模式。
用户4919348
2019/04/02
1.1K0
Java单例模式
挑战一文搞懂带你搞懂单例模式,面试手撕双重检查锁定单例模式不害怕!
最近在刷牛客的时候,发现现在的面试官出笔试题都已经不局限在Hot100,大把大把的同学在面试的时候被考到了与设计模式相关的笔试题。
程序员牛肉
2024/11/21
4930
挑战一文搞懂带你搞懂单例模式,面试手撕双重检查锁定单例模式不害怕!
Java之单例模式
要点: 饿汉式单例模式代码中,static变量会在类装载时初始化,此时也不会涉及多个线程对象访问该对象的问题。虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题。因此,可以省略synchronized关键字。 问题:如果只是加载本类,而不是要调用getInstance(),甚至永远没有调用,则会造成资源浪费!
全栈程序员站长
2022/06/30
2350
设计模式系列 - 单例模式
我不知道大家工作或者面试时候遇到过单例模式没,面试的话我记得我当时在17年第一次实习的时候,就遇到了单例模式,面试官是我后来的leader,当时就让我手写单例,我记得我就写出了饿汉式,懒汉式,但是并没说出懒汉和饿汉的区别,当时他给我一通解释我才知道了其中的奥秘。
敖丙
2021/03/09
5110
设计模式系列 - 单例模式
Java单例模式的写法及优缺点
优点:实现简单,不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法。
老马的编程之旅
2022/06/22
8240
单例模式的七种写法,你都知道吗?
因为instance是个静态变量,所以它会在类加载的时候完成实例化,不存在线程安全的问题。
三分恶
2021/09/14
4870
单例模式和多例模式(懒汉式和饿汉式)
所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action;
ha_lydms
2023/08/09
3910
设计模式(一)之单例模式
关键代码:构造函数是私有的。 应用场景: 1.一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 2.创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。 3.Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。 UML图:
周杰伦本人
2023/10/12
2540
设计模式(一)之单例模式
单例模式的八种写法比较
单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生。一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式。但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧。
Spark学习技巧
2018/12/28
6540
Java设计模式简介(一):创建型模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。
全栈程序员站长
2021/04/09
3530
Java设计模式简介(一):创建型模式
趣解设计模式之《新娘到底叫啥名啊?》
前一段时间,在网上流传了这么一段视频,视频是一对新人的婚礼现场,主持人让新郎当着众多亲戚朋友的面,大声对新娘表达自己的爱意,小伙子自信满满大声的对众人说:“我爱你,周秀楠!”。
爪哇缪斯
2023/09/17
4861
趣解设计模式之《新娘到底叫啥名啊?》
Java中的单例模式大全一文掌握所有写法!
在Java的世界里,单例模式(Singleton Pattern)是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。今天,我们将深入探讨Java中所有单例模式的写法,包括经典的懒汉式、饿汉式,以及现代的枚举式和静态内部类式。此外,我们还将手写一个线程安全的单例模式,并分析其运行原理、应用场景以及源码。如果你对设计模式感兴趣,或者正在寻找提高代码质量的秘诀,那么这篇文章绝对不容错过!
疯狂的KK
2024/06/03
3340
Java中的单例模式大全一文掌握所有写法!
相关推荐
一、单例模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档