首页 > 其他分享 >设计模式-单例模式

设计模式-单例模式

时间:2024-09-13 11:51:41浏览次数:3  
标签:Singleton 模式 instance 线程 private 单例 static 设计模式 public

单例模式(Singleton Pattern)是一种常用的软件设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。在Java中,实现单例模式有多种方式,但主要可以归纳为以下几种:

1. 懒汉式(线程不安全)

这是最基本的实现方式,但是它在多线程环境下是不安全的。

java复制代码
 public class Singleton {  
 
     private static Singleton instance;  
 
   
 
     private Singleton() {}  
 
   
 
     public static Singleton getInstance() {  
 
         if (instance == null) {  
 
             instance = new Singleton();  
 
         }  
 
         return instance;  
 
     }  
 
 }

2. 懒汉式(线程安全)

通过在getInstance()方法上添加synchronized关键字,使其在多线程环境下安全,但效率较低。

java复制代码
 public class Singleton {  
 
     private static Singleton instance;  
 
   
 
     private Singleton() {}  
 
   
 
     public static synchronized Singleton getInstance() {  
 
         if (instance == null) {  
 
             instance = new Singleton();  
 
         }  
 
         return instance;  
 
     }  
 
 }

3. 双重检查锁定(Double-Checked Locking)

这种方式既保证了线程安全,又比单纯的同步方法效率要高。

java复制代码
 public class Singleton {  
 
     private static volatile Singleton instance;  
 
   
 
     private Singleton() {}  
 
   
 
     public static Singleton getInstance() {  
 
         if (instance == null) {  
 
             synchronized (Singleton.class) {  
 
                 if (instance == null) {  
 
                     instance = new Singleton();  
 
                 }  
 
             }  
 
         }  
 
         return instance;  
 
     }  
 
 }

注意,这里instance变量被声明为volatile,这是为了防止指令重排序。

4. 静态内部类

这种方式利用了classloder的机制来保证初始化instance时只有一个线程,既实现了线程安全,又避免了同步带来的性能影响。

java复制代码
 public class Singleton {  
 
     private Singleton() {}  
 
   
 
     private static class SingletonHolder {  
 
         private static final Singleton INSTANCE = new Singleton();  
 
     }  
 
   
 
     public static final Singleton getInstance() {  
 
         return SingletonHolder.INSTANCE;  
 
     }  
 
 }

5. 枚举

这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射的时候,这种实现方式仍然有效。

java复制代码
 public enum Singleton {  
 
     INSTANCE;  
 
   
 
     public void whateverMethod() {  
 
     }  
 
 }

总结

  • 懒汉式(线程不安全)和懒汉式(线程安全)实现简单,但前者在多线程环境下不安全,后者虽然安全但效率较低。
  • 双重检查锁定方式既保证了线程安全,又提高了效率,但实现较为复杂。
  • 静态内部类方式利用了classloder机制,既实现了线程安全,又避免了同步的开销。
  • 枚举方式是实现单例模式的最佳方法,它更简洁,更安全。

标签:Singleton,模式,instance,线程,private,单例,static,设计模式,public
From: https://blog.51cto.com/u_16406687/12000159

相关文章

  • WPF MVVM入门系列教程(一、MVVM模式介绍)
    为什么写这些博客?还记得早些年刚工作的那会,公司的产品从Delphi转成了WPF(再早些年是mfc)。当时大家也是处于一个对WPF探索的阶段,所以有很多概念都不是非常清楚。但是大家都想堆技术,就提出使用MVVM,我那会是第一次听到MVVM,在网上看了一些资料后,也难以理解,后面也是硬着头皮在写。有......
  • C# 标准事件模式示例
    1usingSystem;23namespaceConsoleApp3_Test4{56internalclassAa7{89staticvoidMain(string[]args)10{11Stockstock=newStock("THPW");12stock.Price=27.10M;131......
  • Qt C++设计模式->建造者模式
    建造者模式简介建造者模式(BuilderPattern)是一种创建型设计模式,它通过使用多个简单的对象一步步构建一个复杂对象。建造者模式允许你分步骤创建复杂对象,并且你可以控制每个步骤如何执行。该模式常用于对象的创建过程非常复杂且需要有多个可选参数的场景。建造者模式的应用场......
  • 攻防世界-web引导模式-难度:1-disabled_button详细解答
    大家好,我是一名信息安全专业大二学生,今天是24年9月11日,我之前在攻防世界不时的去做一些题,遇到不会做的直接看writeup,但是过几天就忘了或者是学的根本没用,自己在笔记本上记笔记也觉得很麻烦而且作用不大,觉得自己像是在装逼,所以我从今天开始,不管做的题有多简单还是难,都会在该账号......
  • Interpreter 设计模式
    实际用途:简单的计算器假设我们要实现一个简单的计算器,可以解析并计算基本的数学表达式,包括加法、减法、乘法和除法。这个计算器将能够处理表达式如"3+5*(2-8)"。使用解释器模式的代码示例1.表达式接口java复制代码interfaceExpression{intinterpret();}......
  • Python中的观察者模式:从入门到精通
    引言观察者模式允许对象(称为“观察者”)注册到另一个对象(称为“主题”或“被观察者”),从而在主题状态改变时自动收到通知。这种机制使得多个观察者可以独立地响应同一个事件,增强了系统的灵活性和可维护性。特别是在构建高度解耦、易于扩展的应用程序时,观察者模式显得尤为重要。基础......
  • 设计模式——UML类图
    UML类图UML基本介绍UML——UnifiedmodelinglanguageUML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于述软件模型中的各个元素和他们之间的......
  • 软件设计模式-单例模式
    单例模式(SingletonPattern)是创建型设计模式的一种,旨在确保一个类在整个应用程序运行期间只有一个实例,并提供全局访问点来获取该实例。这种模式对于那些希望在整个系统中共享唯一对象的场景非常有用,比如数据库连接、日志系统、配置管理器等。单例模式的核心要点唯一实例:类只能有......
  • 软件设计模式-生成器模式
    生成器模式的结构生成器(Builder):提供构建产品各部分的方法,一般是一步一步构建复杂对象的各个部分。具体生成器(ConcreteBuilder):实现生成器接口,构建和装配具体的产品部件。产品(Product):最终生成的复杂对象。指挥者(Director):负责安排构建步骤,控制生成器构建对象的过程(可选)。客户端......
  • 软件模式-原型模式
    原型模式的核心思想原型模式的核心是使用一个原型接口来定义一个克隆方法,该方法允许对象自身进行复制。通过这个克隆方法,可以快速生成一个与原型对象相同的实例,而不需要直接创建新对象并手动设置属性。原型模式的结构原型接口(Prototype):定义一个clone()方法,用于克隆对象。具......