单例模式之饿汉式和懒汉式详解

一、何为单例模式、饿汉式、懒汉式

单例模式是设计模式的一种,解决了一个类在内存中只存在一个对象。

单例模式有以下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的实例,因为构造方法是私有的,无法在外部被实例化
  3、单例类必须给所有其他对象提供这一实例,也就是说要把getInstance这个方法变成公有

饿汉式:不管你用的用不上,一开始就建立这个单例对象

懒汉式:是延迟化加载,在你真正用到的时候才去建这个单例对象.


注:主要解释会写在代码注释中

二、饿汉式

        /**
	 * 单例之饿汉式
	 * 注:使用static final修饰,随着类的加载,加载一个不可变的单例对象到内存中
	 */
	private static final SingletonTest single = new SingletonTest();
	/**
	 * 私有化
	 */
	private SingletonTest() {}
	public static SingletonTest getInstance() {
		return single;
	}

调用方式:

public static void main(String[] args) {
		SingletonTest st = SingletonTest.getInstance();
	}

三、懒汉式

        /**
	 * 单例之懒汉式
	 * @param args
	 */
	private static SingletonTest single = null;
	private SingletonTest() {}
	public static SingletonTest getInstance() {
		/**
		 * 以下代码的作用,使用双重判断:
		 * 1.实现单例,并且要线程安全
		 * 2.减少锁的判断次数,增加效率
		 */
		if(single == null) {//如果single不为空,则直接返回结果,也就不会再判断锁了,减少判断锁的次数
			synchronized (SingletonTest.class) {//为了线程安全,加入同步块,但是每个线程执行到此都会判断锁(0 则表示可执行 1则表示被锁不可执行),影响效率
				if(single == null) {//如果是多线程,并且此处有多个线程在此等待着,一旦都执行则就违背了单例的目的了
					single = new SingletonTest();
				}
			}
		}
		return single;
	}
所以在以后的开发当中建议使用饿汉式






猜你喜欢

转载自blog.csdn.net/cb_lcl/article/details/80928393