在工作中用最常用的选择是饿汉式和双重检查懒汉式。最完美的是Effective Java中推荐的enum方式
1、恶汉式:
类加载到内存中,就实例化一个单例,JVM保证线程安全,简单实用
一个小缺点:无论用到与否,类加载时就完成实例化
public class HungrySingleton {
private static final HungrySingleton INSTANCE = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return INSTANCE;
}
2、懒汉式
一个是在静态方法上加锁,相当于锁定了整个类,可能会对效率有影响
public class LazySingleton1 {
private static LazySingleton1 INSTANCE;
private LazySingleton1() {
}
/**
* 1、静态方法加锁,锁定了LazySingleton
*
* @return
*/
public static synchronized LazySingleton1 getInstance1() {
if (INSTANCE == null) {
INSTANCE = new LazySingleton1();
}
return INSTANCE;
}
双重检查机制:要加volatile,防止JVM的指令重排
public