java单例设计模式
单例模式的概念
单例类只有一个实例,并且只由自己创建,实例化后向整个系统提供自己的实例。
单例设计模式主要分为2种:懒汉式和饿汉式。2者的区别在于初始化的时间不同。
像线程池,缓存,日志等都被设计成单例模式;spring中所有的bean不设置作用域的话,默认都是单例模式。
这些单例类大多都是具有管理资源的用途。
饿汉式单例模式的实现
饿汉式单例模式在定义类的时候被实例化。
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
1.构造方法私有化,防止被外部实例化(虽然通过反射还是可以创建);
2.内部声明私有变量并实例化;
3.为外部提供访问该实例的静态方法。
懒汉式单例模式的实现
懒汉式单例模式在调用方法的时候才实例化。
public class Singleton { private Singleton() {} private static Singleton single=null; //静态工厂方法 这里加上同步锁,让这个方法不会同时被多个线程访问 public static Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } }
懒汉式的实现与之前的基本相同,只是实例化放在了方法内。
好处是消耗系统资源少。
坏处是它并不是同步的,如果在多线程下,可能被创建多个实例。因此在上面可以为方法加锁,保证同步。