单例模式主要的目的就是保证类只有一个实例,只通过一个对外提供的方法提供类对象
优点:
在内存中只有一个对象,占用空间较少
避免频繁的创建销毁对象,提供性能
常见的几种写法
public class SingleClass {
//饿汉式
public static SingleClass single = new SingleClass();
//私有构造方法
private SingleClass(){};
//提供一个静态的方法获取实例对象
public static SingleClass getSingle(){
return single;
}
}
特点:线程安全,因为在调用获取对象时对象是被初始化,其它线程无法进行对象初始化
//懒汉式 非线程安全的
//懒加载作用
public class Single {
public static Single single ;
//私有构造方法
private Single(){};
//提供对外方法
public static Single getSingle(){
if (single == null){
single = new Single();
}
return single;
}
}
//双重校验锁
public class SingleObject {
public static volatile SingleObject singleObject;
//私有构造方法
private SingleObject(){};
//双重校验
public static SingleObject getInstance(){
//进行判断
if(singleObject == null){
synchronized (SingleObject.class){
if (singleObject == null){
singleObject = new SingleObject();
}
}
}
return singleObject;
}
}
//双重校验锁的执行过程
线程1进入到getInstance方法
由于singleObject为null,所以进入到synch关键字时获取到锁
线程2进入到getInstance方法
由于singleObject为null值,锁被线程1占有所以等待
线程1再次判断singleObject是否为null,再实例化对象
等线程1跑完程序之后,释放锁时,线程2再次判断变量是否为null
返回线程1创建的对象
//静态内部单例模式
//线程安全同时是懒加载
public class SingleClassI {
//私有构造方法
private SingleClassI(){};
public static SingleClassI getInstance(){
return Single.classI;
}
private static class Single{
private static SingleClassI classI = new SingleClassI();
}
}