2.单例模式

2.单例模式

题目:设计一个类,规定只能生成一个该类的实例。

普通解法,单线程环境下不会出错,但是多线程环境下可能会出错。

//单线程环境
public class Singleton1{
     
	private static Singleton1() {
     
	}
	private static Singleton1 instance = null;
	public static Singleton1 getInstance() {
     
		 if (instance == null) {
     
		 	return new Singleton1();
		 }
	}
}
//

上述解法多线程环境下可能会出错:如果同时有两个线程在同一时刻判断了instance是否为null,则都为null,会生成2个实例。 针对上述问题修改为多线程环境中工作。

//先加锁后判断,但是加锁开销大,效率不高
public class Singleton2{
     
	private static Singleton2() {
     
	}
	private static Singleton2 instance = null;
	public static Singleton2 getInstance() {
     
		synchronized (Singleton2.class){
     
			if (instance == null) {
     
			 	instance = new Singleton2();
			}
		}
		return instance;
	}
}

//由于加锁的消耗较大,因此尽量避免加锁的操作,在确定实例为空后,创建时加锁
public class Singleton3{
     
	private static Singleton3() {
     
	}
	private static Singleton3 instance = null;
	public static Singleton3 getInstance() {
     
		if (instance == null) {
     
			synchronized (Singleton3.class){
     
				instance == new Singleton3();
			}
		}
		return instance;
	}
}

使用静态内部类,线程安全。

public class Singleton4{
     
	//构造函数私有化
	private static Singleton(){
     
	}
	private static class SingletonHolder{
     
		private static Singleton myInstance = new Singleton();
	}
	public static Singleton getInstance() {
     
		return SingletonHolder.myInstance;
	}
}

饿汉模式,直接生成,需要时调用即可,空间换时间,不存在线程安全的问题

public class Singleton5{
     
	private static Singleton5() {
     
	}
	private static Singleton5 instance = new Singleton5();
	public static getInstance() {
     
		return instance;
	}
}

你可能感兴趣的:(剑指offer题解系列,java,面试)