1:什么是单例模式?
类的创建模式 对象的创建模式
单例模式确保一个类只有一个实例,自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例类必须给所有其它对象提供这一实例
2:创建单例模式的方法
常规写法 只判断对象是否被实例化 线程不安全
public class SingleUtil {
private static SingleUtil mSingleUtil;
public static SingleUtil getInstance() {
if (mSingleUtil == null) {
mSingleUtil = new SingleUtil();
}
return mSingleUtil;
}
public void test() {
System.out.println("test single module");
}
}
该写法如果存在多线程 同时进入该方法 就会重复创建该类 不符合单例模式的定义 那么需要对该类加锁
2:线程安全的写法
public class SingleUtil {
private static SingleUtil mSingleUtil;
public static SingleUtil getInstance() {
synchronized (SingleUtil.class) {
if (mSingleUtil == null) {
mSingleUtil = new SingleUtil();
}
return mSingleUtil;
}
}
public void test() {
System.out.println("test single module");
}
}
该写法虽然说对该类进行了加锁 但是如果存在多线程 那么每次每个线程都会执行synchronized 加锁用来判断是否被实例化 这不高效 所以延伸出如下写法
3.线程安全 效率高
public class SingleUtil {
private static SingleUtil mSingleUtil;
public static SingleUtil getInstance() {
if (mSingleUtil == null) {
synchronized (SingleUtil.class) {
if (mSingleUtil == null) {
mSingleUtil = new SingleUtil();
}
return mSingleUtil;
}
}
return mSingleUtil;
}
public void test() {
System.out.println("test single module");
}
}
这里启用了双重判断 首先对该类判空 在进入加锁的操作 然后在判断空进行类的实例化 这样可以防止多线程每次直接都进入加锁的操作
这里一般推荐第三种写法