- public class Singleton{
-
- //在类加载时已经创建好该对象,在程序调用时直接返回该单例对象
- private static final Singleton INSTANCE= new Singleton();
-
- private Singleton(){}
-
- public static Singleton getInstance() {
- return INSTANCE;
- }
- }
- public final class Singleton {
- private Singleton() { }
-
- private static volatile Singleton INSTANCE = null;
-
- public static Singleton getInstance() {
- if (INSTANCE != null) {
- return INSTANCE;
- }
-
- //每次去获取对象都需要先获取锁,并发性能非常地差,极端情况下,可能会出现卡顿现象
- //优化:如果没有实例化对象则加锁创建,如果已经实例化了,则不需要加锁,直接获取实例
- synchronized (Singleton.class) {
- if (INSTANCE != null) {
- return INSTANCE;
- }
- INSTANCE = new Singleton();
- return INSTANCE;
- }
- }
- }
3、懒汉式_静态内部类(比较推荐)
- public final class Singleton {
- private Singleton() { }
-
- private static class LazyHolder {
- static final Singleton INSTANCE = new Singleton();
- }
-
- public static Singleton getInstance() {
- //用到时才会给LazyHolder.INSTANCE做初始化;
- return LazyHolder.INSTANCE;
- }
- }
4、枚举创建
优点:
①在程序启动时,会调用Singleton的空参构造器,实例化好一个Singleton对象赋给INSTANCE,之后再也不会实例化;;
②使用枚举可以防止调用者使用反射、序列化与反序列化机制强制生成多个单例对象,破坏单例模式。
- public enum Singleton {
- INSTANCE;
- }