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

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

知其然知其所以然:时如白驹,间似流水—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
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
2天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
11 0
|
2天前
|
设计模式 安全 编译器
【代码片段】【C++】C++11线程安全单例模式
【代码片段】【C++】C++11线程安全单例模式
17 1
|
2天前
|
设计模式 安全 Java
【JavaEE多线程】从单例模式到线程池的深入探索
【JavaEE多线程】从单例模式到线程池的深入探索
22 2
|
2天前
|
设计模式 安全 Java
多线程案例-单例模式
多线程案例-单例模式
246 0
|
2天前
|
存储 安全
除了Lock对象,还有其他方法可以实现多线程安全的单例模式吗?
【2月更文挑战第5天】【2月更文挑战第12篇】除了Lock对象,还有其他方法可以实现多线程安全的单例模式吗?
|
2天前
|
存储 安全 Python
如何在Python中实现一个单例模式,确保在多线程环境中也是安全的?
【2月更文挑战第5天】【2月更文挑战第11篇】如何在Python中实现一个单例模式,确保在多线程环境中也是安全的?
|
2天前
|
设计模式 安全 编译器
多线程(初阶六:单例模式)
多线程(初阶六:单例模式)
26 0
|
2天前
|
消息中间件 安全 调度
多线程06 单例模式,阻塞队列以及模拟实现
多线程06 单例模式,阻塞队列以及模拟实现
30 0
|
2天前
|
设计模式 安全 Java
【JavaEE】多线程案例-单例模式
【JavaEE】多线程案例-单例模式