知其然知其所以然:时如白驹,间似流水—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,直接返回即可.
优点:
类加载时完成初始化,获取对象的速度较快.
缺点:
类加载较慢.