
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance ;
}
}//页面计数器
public class PageCounter {
private static final PageCounter instance = new PageCounter();
// 计数器
private AtomicLong counter = new AtomicLong(0);
private PageCounter() {
}
public static PageCounter getInstance() {
return instance ;
}
public void add() {
counter.getAndAdd(1);
}
public long get() {
return counter.get();
}
}//饿汉模式(推荐),类加载时就创建了
//优点:1、线程安全;2、调用getInstance时速度快
//缺点:1、无法延迟加载;2、有可能浪费资源,无人调用getInstance()时,仍然创建了实例
public class Singleton01 {
private static final Singleton01 instance = new Singleton01();
private Singleton01() {
}
public static Singleton01 getInstance() {
return instance ;
}
}第二种(饿汉变种)//饿汉模式变种,类加载时就创建了,和上一个模式区别不大,只是能在static中加入逻辑处理
public class Singleton02 {
private static Singleton02 instance = null;
static {
// 此处可以写一些逻辑
instance = new Singleton02();
}
private Singleton02() {
}
public static Singleton02 getInstance() {
return instance ;
}
}第三种(懒汉)//懒汉(线程不安全),用到了再去初始化
//优点:延迟加载
//缺点:致命的并发问题,可能导致创建多次
public class Singleton03 {
private static Singleton03 instance = null;
private Singleton03() {
}
public static Singleton03 getInstance() {
if ( instance == null ) {
// 此处有并发问题
instance = new Singleton03();
}
return instance ;
}
}第四种(懒汉变种)//懒汉(线程安全)
//优点:延迟加载
//缺点:效率低下,初始化完毕后,getInstance()方法根本不需要同步了
public class Singleton04 {
private static Singleton04 instance = null;
private Singleton04() {
}
public synchronized static Singleton04 getInstance() {
if ( instance == null ) {
instance = new Singleton04();
}
return instance ;
}
}第五种(双重锁定检查)//双重锁定检查
//优点:延迟加载,效率高
//缺点:jdk1.5之后才可以用
//由于jdk1.5之前编译器允许处理器乱序执行,所以可能导致获取到没初始化完毕的instance
public class Singleton05 {
private static Singleton05 instance = null;
private Singleton05() {
}
public static Singleton05 getInstance() {
if ( instance == null ) {
synchronized (Singleton05.class) {
if ( instance == null ) {
instance = new Singleton05();
}
}
}
return instance ;
}
}第六种(枚举)//枚举方式(推荐),Effective Java作者Joshua Bloch推荐的方式
//优点:不仅能避免线程同步问题,还能防止反序列化生成新的对象,相当严谨
//最主要的是非常的简单
//缺点:枚举是jdk1.5之后加入的特性,对版本有要求
public enum Singleton06 {
instance;
public void someMethod() {
// 业务逻辑方法
}
}第七种(静态内部类) //静态内部类
//优点:解决线程安全问题,而且可以延迟加载,基本上是曾经最好的办法
//缺点:代码复杂
public class Singleton07 {
private static class RealSingleton {
static final Singleton07 instance = new Singleton07();
}
public static Singleton07 getInstance() {
return RealSingleton.instance;
}
}单例模式创建方法有很多种,没有最好的,只有最合适的,比如第七种方法比较好,但是没必要为了一个不会出现的问题而使用很复杂的第七种模式,如果没有需要延迟加载的地方(如读取配置文件等),推荐第一种模式,如果是JDK1.5以上,推荐使用枚举的方法。原文:http://blog.csdn.net/xuepiaohan2006/article/details/25690005