单例模式
单例模式有两种模式,饥汉模式和懒汉模式,懒汉式需要对多线程进行同步处理
为什么懒汉式需要多线程处理?
因为懒汉式开始赋值是null,所以getInstance方法开始判断是否为null,如果是null,则创建一个新的对象,如果不是则返回,看起来是没什么问题,但是如果是多线程同一时间进行访问,可能在一个线程访问是null的同时,另一个线程访问也是null,因此要将线程同步,线程同步只需要在还没创建对象的时候同步,因此写在里面,返回的时候不用同步,增加效率
- 饥汉模式
public class Singleton {
//1.私有化构造方法
private Singleton (){};
//2.创建类的唯一实例,用public static修饰
private static Singleton instance = new Singleton();
//3.返回一个用于获取实例的方法,使用public static修饰
public static Singleton getInstance() {
return instance;
}
}
- 懒汉模式
class Singleton2 {
// 2.声明本类类型的引用指向本类类型的对象并使用private static关键字修饰
private static Singleton2 sin = null;
// 1.私有化构造方法,使用private关键字修饰
private Singleton2() {}
// 3.提供公有的get方法负责将上述对象返回出去,使用public static关键字修饰
public static /*synchronized*/ Singleton2 getInstance() {
/*synchronized (Singleton.class) {
if (null == sin) {
sin = new Singleton();
}
return sin;
}*/
if (null == sin) {
synchronized (Singleton.class) {
if (null == sin) {
sin = new Singleton2();
}
}
}
return sin;
}
}