设计模式17:单例模式

单例模式就是说系统中对于某类的只能有一个对象,不可能出来第二个。

static修饰的方法,不能再用abstract修饰,也不能Override。这是因为static方法是属于类的,不会被继承。

最基本的单例模式不是线程安全的,当有多个线程同时getInstance时,有可能实例化了多个对象。

下面比较单例模式的几种实现方式的优缺点:

Hungry模式:

public class HungrySingleton{
	
	static HungrySingleton instance = new HungrySingleton();
	
	private HungrySingleton(){
		
	}

	public static HungrySingleton getInstance(){
		return instance;
	}

}

这种模式当类被加载时,创建一个实例。当系统中这样的类较多时,会使得启动速度变慢 。现在流行的设计都是讲“延迟加载”,我们可以在第一次使用的时候才初始化第一个该类对象。所以这种适合在小系统。 

Lazy模式1:

public class LazySingleton1 {
	
	static LazySingleton1 instance;
	
	private LazySingleton1(){
		
	}
	
	public synchronized static LazySingleton1 getInstance(){
		if(instance == null){
			instance = new LazySingleton1();
		}
		return instance;
	}

}

上述代码中的一次锁住了一个方法, 这个粒度有点大 ,改进就是只锁住其中的new语句就OK。就是所谓的“双重锁”机制。

Lazy模式2:

public class LazySingleton2 {
	
	static LazySingleton2 instance;
	
	private LazySingleton2(){
		
	}
	
	public static LazySingleton2 getInstance(){
		if(instance == null){
			synchronized (LazySingleton2.class) {
				if(instance == null){
					instance = new LazySingleton2();
				}
			}
		}
		return instance;
	}

}

  

原文地址:https://www.cnblogs.com/zcy-backend/p/6719822.html