以前我在使用单例模式时,一般都不是使用的懒加载,
如下:
或者使用synchronized直接锁定方法,
如下:
其中前者没有什么懒加载,这造成了一定资源上的浪费;后者使用了懒加载,但这种懒加载是使用在锁的基础上的,当并发高的时候,会产生阻塞。
后来又发现一种方法,没有使用锁,但确实是懒加载,这就是使用内部类的静态变量初始的单例对象:
注:不要使用什么二重检查锁或多重检查锁,因为一些研究已经证明这种方法不能保证对象能够绝对安全的初始化。详情请看 [url]http://xiaoxiao-0311.iteye.com/blog/1046666[/url]
如下:
public class SingletomFactory
{
private static MySingleton instance = new MySingleton();
public static MySingleton getInstance(){
return instance;
}
}
或者使用synchronized直接锁定方法,
如下:
public class SingletomFactory
{
private static MySingleton instance = null;
public synchronized static MySingleton getInstance(){
if(instance == null){
instance = new MySingleton();
}
return instance;
}
}
其中前者没有什么懒加载,这造成了一定资源上的浪费;后者使用了懒加载,但这种懒加载是使用在锁的基础上的,当并发高的时候,会产生阻塞。
后来又发现一种方法,没有使用锁,但确实是懒加载,这就是使用内部类的静态变量初始的单例对象:
public class SingletomFactory
{
private static class Facotry{
public static final MySingleton instance = new MySingleton();
}
public synchronized static MySingleton getInstance(){
return Facotry.instance;
}
}
注:不要使用什么二重检查锁或多重检查锁,因为一些研究已经证明这种方法不能保证对象能够绝对安全的初始化。详情请看 [url]http://xiaoxiao-0311.iteye.com/blog/1046666[/url]