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