单例模式
饿汉式
package com.wb.magic.rest.design;
/**
* 单例模式指的时只有一个对象,没有其他对象
* 1.那如何保证只有一个对象,避免其他类直接去new
* 设置成私有private
* 2.将提供好的对象公开,保证所以对象获取都走这同一个方法
* 饿汉式
*/
public class SingleBeanModel {
//方法一:
/*private static final SingleBeanModel singleBean=new SingleBeanModel();
private SingleBeanModel() {
}*/
//方法二(初始化操作比较复杂时候):
private static final SingleBeanModel singleBean;
static {
//...前面有若干步骤
singleBean = new SingleBeanModel();
}
//对外公开的bean对象
public static SingleBeanModel getSingleBean() {
return singleBean;
}
}
懒汉式
package com.wb.magic.rest.design;
/**
* 懒汉式
*/
public class SingleBeanModel1 {
//1.volatile防止指令重排,保存可见性
//2.指令重排:比如这里SingleBeanModel1就涉及分配内存,初始化对象,赋值
//3.如何某个线程赋值成功,其他线程返回时候返回时候直接赋值返回,没有经过初始化对象。
private volatile static SingleBeanModel1 singleBeanModel=null;
private SingleBeanModel1() {
}
public static SingleBeanModel1 getSingleBean(){
//只有对象为空才进入同步代码块
if(singleBeanModel==null){
synchronized (SingleBeanModel1.class){
//释放锁后,如果其他线程的对象为空,才去new
if(singleBeanModel==null){
singleBeanModel=new SingleBeanModel1();
}
}
}
return singleBeanModel;
}
}