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

什么是单例模式?

单例模式就是在JVM中一个对象只能有一个实例。

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

什么是懒汉式?

就是需要的才会去实例化,线程不安全。

什么是饿汉式?

就是当class文件被加载的时候就已经初始化,天生线程安全。

懒汉式写法

/**
 * 保证这个类在JVM中只有一个实例化对象
 */
class Singleton{
	private static Singleton singleton;	
	
	//怎样解决不让无限new的问题?让构造函数私有化
	//但是这样有一个缺点:反射不能在通过构造函数初始化了
	private Singleton() {
		
	}
	 /*
	  * 懒汉式就是当你需要的时候才会被实例化,之后用的都是同一个实例
          * 但是懒汉式线程不安全,当两个线程同时执行getSingleton方法时,可能会new两个 
          * Singleton,违背了单例的原则
	  * 会发生线程不安全问题,所以需要加上同步
	  */
	static public Singleton getSingleton() {
		if(singleton==null) {
			synchronized (Singleton.class) {
				singleton=new Singleton();
			}
		}
		return singleton;
	}
}

public class SingletonTest {
	public static void main(String[] args) {
		Singleton singleton1=Singleton.getSingleton();
		Singleton singleton2=Singleton.getSingleton();
		//为true,说明两者是同一个实例
		System.out.println(singleton1==singleton2);
	}
}

饿汉写法

/**
 * 饿汉式:就是当class文件被加载的时候,就会被初始化,天生线程安全
 */
class Singleton1{
	//用final修饰后,只能被初始化一次,以后不能再被更改
	private static final Singleton1 singleton1=new Singleton1();
	
	private Singleton1() {
		
	}
	
	static public Singleton1 getSingleton() {
		return singleton1;
	}
}

public class SingletonTest2 {
	public static void main(String[] args) {
		Singleton1 singleton1=Singleton1.getSingleton();
		Singleton1 singleton2=Singleton1.getSingleton();
                //为true,说明两者是同一个实例
		System.out.println(singleton1==singleton2);
	}
}

总结:

懒汉式就是当你需要使用的时候才会被初始化,之后都是用一个实例,但是线程不安全,需要使用synchronized进行同步。

饿汉式就是当class文件被加载的时候,就会被初始化,天生线程安全。

原文地址:https://www.cnblogs.com/hzcya1995/p/13309485.html