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

知其然知其所以然:时如白驹,间似流水—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,直接返回即可.

优点:

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

缺点:

类加载较慢.

你可能感兴趣的:(设计模式)