这里主要讲一下懒汉模式和恶汉模式
1) 懒汉模式:
//懒汉模式
public class LazySingle {
private static LazySingle sInstance = null;
private LazySingle() {}
public static LazySingle getInstance() {
if (sInstance == null) {
sInstance = new LazySingle();
}
return sInstance;
}
}
这是非线程安全的写法,在多线程并发执行的时候,就会很容易出现安全隐患。
优点:懒加载启动快,资源占用小,使用时才实例化,无锁。
缺点:不安全
接下来看看线程安全的写法,其实就是加个锁
public class LazySingle {
private static LazySingle sInstance = null;
private LazySingle() {}
public static LazySingle getInstance() {
if (sInstance == null) {
synchronized (LazySingle.class) {
if (sInstance == null) {
sInstance = new LazySingle();
}
}
}
return sInstance;
}
}
这样我们的安全隐患就被解决了,但是同样带来了一个问题。那就是每次都要判断锁,程序的执行效率就会比较低,所以我们就应该尽量减少判断锁的次数,以提高运行效率,加上双重判断。
2)饿汉模式:
//恶汉模式
public class HungrySingle {
//直接在这里创建类实例,只会创建一次
private static final HungrySingle sInstance = new HungrySingle();
private HungrySingle() {}
public static HungrySingle getInstance() {
return sInstance;
}
}
优点:饿汉模式天生是线程安全的,使用时没有延迟。
缺点:启动时即创建实例,启动慢,有可能造成资源浪费。
所以对比下来,个人推荐优先恶汉模式,简单,安全。