单例模式

单例模式

引言

  单例设计模式是 23 种设计模式中最简单、使用最多的设计模式,也是必须掌握的一个设计模式。

定义

单例模式为系统中的类只允许实例化唯一一个对象这类典型问题提供的解决方案。

  许多时候系统只需要拥有一个的全局对象,比如系统中的日历 Calendar 类就只需要一个日历对象,因为所有人的日历都是一样的,可以共享一个全局日历对象,所以 JDK 将 Calendar 类用单例模式设计为单例类。

特点

  • 单例类只能有实例化一个对象
  • 单例类必须自己创建自己的唯一实例化对象
  • 单例类必须给所有其他对象提供统一的对象引用方法

实现

单例模式的实现方式主要有两种:懒汉式单例和饿汉式单例

  • 懒汉式

对于懒汉式,我们可以只在真正需要使用对象时才去创建该单例类对象:

	//懒汉式
	public class IdlerSingleton {
		//volatile 关键字
		//解决 JVM 在实例化对象时会进行优化和指令重排序操作导致的空指针问题,
		//保证其指令执行的顺序与程序指明的顺序一致,不会发生顺序变换。
		private static volatile IdlerSingleton singleton = null;

		private IdlerSingleton() {
	
		}

		public static IdlerSingleton getInstance() 	{ 
			if ( singleton == null) {
				// 线程同步
				synchronized(IdlerSingleton.class) {
					//双重检查锁模式
					if ( singleton == null) {
					singleton = new IdlerSingleton();
					}
				}
			}
			return singleton;
		}
	}

优点:

资源利用率高(第一次调用方法时才进行对象实例化)

缺点:

1.线程不安全(解决办法就是加锁 synchonized)

2.第一次加载时不够快(多线程使不必要的同步开销大,解决办法是:双重检查锁模式+volatile 关键字)

  • 饿汉式

对于饿汉式,我们可以在类加载时已经创建好该单例对象,等待被程序使用:

	//饿汉式
	public class HungrySingleton {
		private static final HungrySingleton SINGLETON = new HungrySingleton();

		private HungrySingleton() {
		
		}
	
		public HungrySingleton getInstance() {
		return SINGLETON;
		}
	}

优点:

1.线程安全(不需要线程同步)

2.第一次调用时反应速度快(类加载即实例化对象)

缺点:

资源利用率不高(即无论是否使用都将占据内存空间)

总结

1.单例模式常见的写法有两种:懒汉式、饿汉式

2.一般采用饿汉式(追求性能)

posted @ 2023-11-06 21:04  一支萝卜  阅读(47)  评论(0)    收藏  举报