最简单安全的单例模式。
package org.leo.singleton;
/**
* @author Leo.Chen
*/
public class Singleton {
private static final Singleton single = new Singleton();
private Singleton() {
}
public static Singleton getInstance(){
return single;
}
}
单例模式,多线程安全、高性能
现在的互联网环境的服务都是集群的,所以synchronized大多数情况下都是无效的,需谨慎使用,即使单服务在多核处理器并发模式下如果没有volatile修饰,依然是失败的实现。
package chris.singleton;
/**
*<p>利用双重检查加锁(double-checked locking)</p>
*首先检查是否实例已经创建,尚未创建才进行同步,只有第一次才进行同步
*@author Chris
*@version 2012-11-27
*/
public class Singleton {
/**volatile 确保当singleton被初始化成Singleton实例时,多个线程正确的处理singleton变量*/
private volatile static Singleton singleton;
private Singleton() {
}
public static Singleton getSingleton(){
if(singleton == null){
synchronized (Singleton.class) {
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
注意事项:
在1.4及更早的Java版本中,许多JVM对于volatile关键字的实现会导致双中检查加锁失效。
使用多个类加载器,可能导致单例失效而产生多个实例。
不过现在许多项目都是通过Spring来实现单例了。