1.懒汉模式
1)必须在该类中,自己先创建出一个对象并私有化对象.
2)私有化自身的构造器,防止外界通过构造器创建新的对象.
3)想外暴露一个公共的静态方法用于获取自身的对象.
目的:保证某一个在整个应用中某一个类有且只有一个实例(一个类在堆内存只存在一个对象),即所有指向该类型实例的引用都指向同一块内存空间。
class ArrayUtil {
privatestatic ArrayUtilinstance =new ArrayUtil();
private ArrayUtil() {
}
publicstatic ArrayUtil getInstance(){
returninstance;
}
public void doWork() {
System.out.println("doSomething............");
}
}
public class SingletonDemo {
publicstatic voidmain(String[] args) {
//获取实例
ArrayUtil instance = ArrayUtil.getInstance();
//调用实例中的方法
instance.doWork();
}
}
2.懒汉模式
1)步骤跟饿汉模式差不多,不过只是在要用到时才创建对象
2) synchronized对于非static方法,同步锁就是this.对于static方法,我们使用当前方法所在类的字节码对象(ArrayUtil.class).
3) ‘双重检查加锁’机制的实现会使用关键字volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,
所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。
class ArrayUtil {
privatestatic volatile ArrayUtil instance =null;
private ArrayUtil() {
}
publicstatic ArrayUtil getInstance(){
if (instance == null) {
//保证线程并发时创建的对象也是唯一的
synchronized (ArrayUtil.class) {
if (instance == null) {
instance =new ArrayUtil();
return instance;
}
}
}
return instance;
}
public void doWork() {
System.out.println("doWork............");
}
}
publicclassLazySingletonDemo {
publicstaticvoid main(String[] args) {
ArrayUtilinstance =ArrayUtil.getInstance();
instance.doWork();
}
}
3.枚举模式实现
枚举来实现是绝对安全,因为反射也不能创建对象
为了更像是工具所以写了个getInstance()方法返回枚举对象
enum ArrayUtil {
instance;
public void doWork() {
System.out.println("doSomething......");
}
publicstatic ArrayUtil getInstance(){
returninstance;
}
}
publicclass EnumSingletonDemo {
publicstatic void main(String[] args) {
//ArrayUtil.instance.doWork();
ArrayUtil instance = ArrayUtil.getInstance();
instance.doWork();
}
}