Singleton大家应该不会很陌生,下面给个给个示例,里面讲了几个我们经常实现单例的方法:
class="java">
public class Singleton {
/* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */
private static Singleton instance = null;
/* 私有构造方法,防止被实例化 */
private Singleton() {
}
/**
* 这个类可以满足基本要求,但是,像这样毫无线程安全保护的类,如果我们把它 放入多线程的环境下,肯定就会出现问题了,
*
* @return
*/
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
/*
*
* synchronized关键字锁住的是这个对象,这样的用法,在性能上会有所下降,因为每次调用getInstance(),都要对对象上锁,事实上,
* 只有在第一次创建对象的时候需要加锁,之后就不需要了,所以,这个地方需要改进。
*/
public static synchronized Singleton getInstance1() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public static Singleton getInstance2() {
if (instance == null) {
synchronized (instance) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
/* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */
public Object readResolve() {
return instance;
}
}
那从Java1.5开始,可以使用
枚举来实现实现单例。
public enum Singleton{
INSTANCE;
}
这种方法更加简洁。而且无常的提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反序列化攻击的时候。