
¶饿汉模式
提到"饿汉模式",相信很多人跟我一样一脸懵逼,为什么叫"饿汉"?为了清楚理解"饿汉模式",请允许我给你们介绍另一个概念: “立即加载”.什么是立即加载?立即加载就是我们在使用类的时候已经将对象创建完毕,常见的的实现方式就是直接new对象.而立即加载从语义来看,有着"急切,马上"的含义,所以称为"饿汉模式".
"饿汉模式"是在调用方法之前,实例对象已经被创建.接下来用代码进行演示
1 | package com.xiebin.day5; |
1 | package com.xiebin.day5; |
1 | package com.xiebin.day5; |
¶懒汉模式
延迟加载就是在调用get()方法时实例才被创建.常见方法就是在get方法中进行new对象.
¶单线程
1 | package com.xiebin.day5; |
1 | package com.xiebin.day5; |
1 | package com.xiebin.day5; |
¶多线程
1 | package com.xiebin.day5; |
在多线程环境下,控制台打印了3个不同的hashcode值,说明创建了三个不同的对象,违背了单例模式的本意
¶优化方法
¶声明synchronize关键字
既然多个线程可以同时访问getInstance()方法,那么我们在这个方法上加把锁,在一段时间内只能有一个线程访问getInstance()方法.
1 | package com.xiebin.day5; |
上述方式是同步运行的,下一个线程要取得对象,就必须等上一个线程释放锁之后,才能继续执行,.效率低下.继续改写代码解决这个缺点
¶同步代码块
同步代码块可以针对某些重要的代码进行单独的同步,这样效率可以大幅度提升.
1 | package com.xiebin.day5; |
¶使用DCL双检查锁机制
1 | package com.xiebin.day5; |

由于DCL无法解决指令重排的问题,需要关键字volatile禁止指令重排,在多线程环境下,使用DCL双检锁+volatile结合才能符合单例模式的要求
¶使用静态内部类
1 | package com.xiebin.day5; |
¶序列化与反序列化
未完待续…
¶使用static代码块
特性: 利用static 带块随着类的加载而执行且只执行一次
1 | package com.xiebin.day5; |
¶使用枚举类
特性: 在使用枚举类时,构造方法会被自动调用
1 | package com.xiebin.day5; |
