单例模式之饿汉式及线程安全问题

简介: 单例模式之饿汉式及线程安全问题

知其然知其所以然:时如白驹,间似流水—TimeFriends



一:上代码


A:饿汉式


public class EHan {
    //饿汉模式
    //将构造函数私有化
    private Singleton(){}
    //将对象实例化
    private static EHan instance = new EHan();
    //得到实例的方法
    public static EHan getInstance() {
        return instance;
    }
}

B:饿汉式执行线程


 public static void main(String[] args) {
     //创建一个可以存放20个线程的线程池
     ExecutorService threadPool = Executors.newFixedThreadPool(20);
     for (int i = 0; i < 20; i++) {
         //执行创建线程(Runable接口)
         threadPool.execute(new Runnable() {
             @Override
             public void run() {
                 System.out.println(Thread.currentThread().getName()+":"+EHan.getInstance());
             }
         });
     }
     //关闭线程池
     threadPool.shutdown();
 }


C:执行结果


pool-1-thread-4:EHan@6519891a
pool-1-thread-14:EHan@6519891a
pool-1-thread-10:EHan@6519891a
pool-1-thread-8:EHan@6519891a
pool-1-thread-5:EHan@6519891a
pool-1-thread-12:EHan@6519891a
pool-1-thread-1:EHan@6519891a
pool-1-thread-9:EHan@6519891a
pool-1-thread-6:EHan@6519891a
pool-1-thread-2:EHan@6519891a
pool-1-thread-16:EHan@6519891a
pool-1-thread-3:EHan@6519891a
pool-1-thread-17:EHan@6519891a
pool-1-thread-13:EHan@6519891a
pool-1-thread-18:EHan@6519891a
pool-1-thread-7:EHan@6519891a
pool-1-thread-20:EHan@6519891a
pool-1-thread-11:EHan@6519891a
pool-1-thread-15:EHan@6519891a
pool-1-thread-19:EHan@6519891a


二:剖原理


分析:


饿汉式是在类加载的时候创建实例,所以线程是安全的.


关键点:


1:私有构造函数


2:静态私有方法—在类加载时已经初始化


3:公开访问点getInstance—不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回即可.


优点:

类加载时完成初始化,获取对象的速度较快.


缺点:

类加载较慢.

目录
相关文章
|
2天前
|
缓存 安全 Java
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
|
3月前
|
安全 Java 关系型数据库
单例模式下引发的线程安全问题
单例模式确保类在进程中仅有一个实例,适用于如数据库连接等场景。分为饿汉式与懒汉式:饿汉式在类加载时创建实例,简单但可能浪费资源;懒汉式延迟创建实例,需注意线程安全问题,常采用双重检查锁定(Double-Checked Locking)模式,并使用 `volatile` 关键字避免指令重排序导致的问题。
72 2
单例模式下引发的线程安全问题
|
2月前
|
设计模式 安全 Java
【多线程-从零开始-柒】单例模式,饿汉和懒汉模式
【多线程-从零开始-柒】单例模式,饿汉和懒汉模式
58 0
|
4月前
|
设计模式 SQL 安全
单例模式大全:细说七种线程安全的Java单例实现,及数种打破单例的手段!
设计模式,这是编程中的灵魂,用好不同的设计模式,能使你的代码更优雅/健壮、维护性更强、灵活性更高,而众多设计模式中最出名、最广为人知的就是Singleton Pattern单例模式。通过单例模式,我们就可以避免由于多个实例的创建和销毁带来的额外开销,本文就来一起聊聊单例模式。
104 0
|
5月前
|
微服务
多线程内存模型问题之在单例模式中,volatile关键字的作用是什么
多线程内存模型问题之在单例模式中,volatile关键字的作用是什么
|
5月前
|
设计模式 安全 Java
Java面试题:解释单例模式的实现方式及其优缺点,讨论线程安全性的实现。
Java面试题:解释单例模式的实现方式及其优缺点,讨论线程安全性的实现。
39 0
|
5月前
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
74 0
|
5月前
|
设计模式 安全 Java
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
79 0
|
5月前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
53 0
|
5月前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
72 0