1、饿汉式
package singleton;
/**
* 饿汉式单例
*
*/
public class HungrySingleton {
/**jvm保证instance只被初始化一次*/
private static HungrySingleton instance = new HungrySingleton();
/**阻止外部使用new实例化对象*/
private HungrySingleton(){
}
/**
* 获取实例
* @return 唯一的instance
*/
public static HungrySingleton getInstance() {
return instance;
}
}
2、懒汉式
package singleton;
/**
* 懒汉式单例
*
*/
public class LazySingleton {
/**
* 阻止外界使用new实例化对象
*/
private LazySingleton() {
}
/**
* 只有在调用getInstance()时此类才会被装载
* 在SingletonKerriganF.java中说明了加载顺序
*/
private static class SingletonHolder {
/**
* 对象实例,jvm保证只初始化一次
*/
static final LazySingleton INSTANCE = new LazySingleton();
}
/**
* 获取实例
* @return 返回唯一实例
*/
public LazySingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
比较:
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
推荐使用第一种