java设计模式----单例模式 weir 2015-04-17 16:58:09.0 java,设计模式 1197 单例模式 其目的是控制实例化(new 一个类)次数. 市面上的单例有饿汉式,懒汉式,双重校验锁,Lazy initialization holder class(延迟初始化容器),最牛的要数枚举单例。 不要问我从哪里来的,我也是网上看到的,(哈哈哈哈)待我给你一一道来。 package com.weir.singleton; /** * 饿汉式--线程安全 * @author Administrator * */ public class Singleton1 { private static Singleton1 singleton = new Singleton1(); private Singleton1(){} public static Singleton1 getInstance() { return singleton; } public void a() { System.out.println("A"); } } package com.weir.singleton; /** * 懒汉式--线程不安全 * @author Administrator * */ public class Singleton2 { private static Singleton2 singleton = null; private Singleton2(){} public static Singleton2 getInstance() { if (singleton==null) { singleton = new Singleton2(); } return singleton; } public void a() { System.out.println("A"); } } package com.weir.singleton; /** * 双重检查加锁优化版--线程安全--(但是极端情况下可能出现空指针异常(编译重排序)volatile 就是用来解决这个问题的) * @author Administrator * */ public class Singleton3 { private volatile static Singleton3 singleton = null; private Singleton3(){} public static Singleton3 getInstance() { if (singleton==null) { synchronized (Singleton3.class) { if (singleton==null) { singleton = new Singleton3(); } } } return singleton; } public void a() { System.out.println("A"); } } package com.weir.singleton; /** * Lazy initialization holder class(延迟初始化容器)--线程安全 * @author Administrator * */ public class Singleton4 { private static class Holder{ private static Singleton4 instance = new Singleton4(); } private Singleton4(){} public static Singleton4 getInstance() { return Holder.instance; } public void a() { System.out.println("A"); } } package com.weir.singleton; /** * 枚举单例模式---线程安全 * @author Administrator * */ public enum SingletonEnum { instance; public void a() { System.out.println("A"); } } package com.weir.singleton; public class Client { public static void main(String[] args) { SingletonEnum s = SingletonEnum.instance; s.a(); } } 看上去一个比一个吊。