java设计模式之单例模式的5种写法

简介: 饱汉模式(懒汉模式) 1 // 饱汉 2 // UnThreadSafe 3 public class Singleton1 { 4 private static Singleton1 singleton = null; 5 private Singleton1() { 6 .

《2019年阿里云双11活动拼团》:https://www.aliyun.com/1111/2019/group-buying-share
【限时】1年86元,3年229元,用来建站和编程学习【附WordPress建站教程


饱汉模式(懒汉模式)

 1 // 饱汉
 2 // UnThreadSafe
 3 public class Singleton1 {
 4   private static Singleton1 singleton = null;
 5   private Singleton1() {
 6   }
 7   public static Singleton1 getInstance() {
 8     if (singleton == null) {
 9       singleton = new Singleton1();
10     }
11     return singleton;
12   }
13 }

优点:懒加载启动快,资源占用小,使用时才实例化,无锁。

缺点:非线程安全。

饱汉模式(懒汉模式)--线程安全

 1 public class Singleton {
 2 
 3     /**
 4      * 定义一个变量来存储创建好的类实例
 5      */
 6 
 7     private static Singleton uniqueInstance = null;
 8 
 9     /**
10      * 私有化构造方法,好在内部控制创建实例的数目
11      */
12 
13     private Singleton(){
14     }
15 
16     /**
17      * 定义一个方法来为客户端提供类实例
18      * @return 一个Singleton的实例
19      */
20 
21     public static synchronized Singleton getInstance(){
22 
23         //判断存储实例的变量是否有值
24         if(uniqueInstance == null){
25             //如果没有,就创建一个类实例,并把值赋值给存储类实例的变量
26             uniqueInstance = new Singleton();
27         }
28 
29         //如果有值,那就直接使用
30         return uniqueInstance;
31     }
32 
33     /**
34      * 示意方法,单例可以有自己的操作
35      */
36 
37     public void singletonOperation(){
38 
39 //功能处理
40 
41     }
42 
43     /**
44      * 示意属性,单例可以有自己的属性
45      */
46 
47     private String singletonData;
48 
49     /**
50      * 示意方法,让外部通过这些方法来访问属性的值
51      * @return 属性的值
52      */
53 
54     public String getSingletonData(){
55 
56         return singletonData;
57 
58     }
59 
60 }            

 优点:同上,但加锁了。

 缺点:synchronized 为独占排他锁,并发性能差。即使在创建成功以后,获取实例仍然是串行化操作。

饱汉模式(懒汉模式)--双重加锁检查DCL(Double Check Lock)

 1 public class Singleton {
 2 
 3     /**
 4      * 对保存实例的变量添加volatile的修饰
 5      */
 6 
 7     private volatile static Singleton instance = null;
 8 
 9     private Singleton(){
10 
11     }
12 
13     public static Singleton getInstance(){
14 
15 //先检查实例是否存在,如果不存在才进入下面的同步块
16 
17         if(instance == null){
18 
19 //同步块,线程安全的创建实例
20 
21             synchronized(Singleton.class){
22 
23 //再次检查实例是否存在,如果不存在才真的创建实例
24 
25                 if(instance == null){
26 
27                     instance = new Singleton();
28 
29                 }
30 
31             }
32 
33         }
34 
35         return instance;
36 
37     }
38 
39 }

 优点:懒加载,线程安全。

 注:实例必须有 volatile 关键字修饰,其保证初始化完全。

饿汉模式

 1 public class Singleton {
 2 
 3 //4:定义一个静态变量来存储创建好的类实例
 4 
 5 //直接在这里创建类实例,只会创建一次
 6 
 7     private static Singleton instance = new Singleton();
 8 
 9 //1:私有化构造方法,好在内部控制创建实例的数目
10 
11     private Singleton(){
12 
13     }
14 
15 //2:定义一个方法来为客户端提供类实例
16 
17 //3:这个方法需要定义成类方法,也就是要加static
18 
19 //这个方法里面就不需要控制代码了
20 
21     public static Singleton getInstance(){
22 
23 //5:直接使用已经创建好的实例
24 
25         return instance;
26 
27     }
28 
29 }

 优点:饿汉模式天生是线程安全的,使用时没有延迟。

 缺点:启动时即创建实例,启动慢,有可能造成资源浪费。

Holder模式

 1 public class Singleton {
 2     /**
 3      * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
 4      * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
 5      */
 6     private static class SingletonHolder{
 7         /**
 8          * 静态初始化器,由JVM来保证线程安全
 9          */
10         private static Singleton instance = new Singleton();
11     }
12     /**
13      * 私有化构造方法
14      */
15     private Singleton(){
16     }
17     public static  Singleton getInstance(){
18         return SingletonHolder.instance;
19     }
20 }

 优点:将懒加载和线程安全完美结合的一种方式(无锁)。(推荐)

备注:

  1. 全局共享,独一份;
  2. 构造函数不暴露(如果暴露便不能保证一份),自己负责自己的构造;
  3. 懒汉式:Lazy load,用到才加载,非线程安全。如何保证线程安全呢:

(1) synchronized getInstance()。

(2)双重检查加锁(volatile)。

  1. 饿汉式:一开始就申请好,浪费了点资源,但其线程安全。
  2. Holder模式:

(1)改成内部类,由JVM保证线程安全性。

相关文章
|
2月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
286 2
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
324 0
|
4月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
330 35
|
2月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
271 8
|
7月前
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
268 15
|
7月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
173 0
|
4月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
4月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
9月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。

热门文章

最新文章