[关闭]
@chenxuxiong 2016-05-23T03:43:41.000000Z 字数 1593 阅读 436

单例模式

JAVA基础 设计模式


默写

1.饿汉式
天生线程安全
但在类创建的同时就已经创建好一个静态的对象供系统使用,所以比较浪费

  1. public class Singleton{
  2. private Singleton(){}
  3. private static Singleton single=new Singleton();
  4. public static getInstance(){
  5. return single;
  6. }
  7. }

2.懒汉式
线程不安全,多线程情况下可能会创建多个实例

  1. public class Singleton{
  2. private static Singleton single=null;
  3. private Singleton(){}
  4. public static Singleton getInstance(){
  5. if(single==null)
  6. single=new Singleton();
  7. return single;
  8. }
  9. }

3.加同步
性能差

  1. public class Singleton{
  2. private static Singleton single=null;
  3. private Singleton(){}
  4. public static synchronized Singleton getInstance(){
  5. if(single==null)
  6. single=new Singleton();
  7. return single;
  8. }
  9. }

4.双重检验锁
线程安全
这种实现方式既可以实现线程安全地创建实例,而又不会对性能造成太大的影响。它只是第一次创建实例的时候同步,以后就不需要同步了,从而加快了运行速度。

  1. public class Singleton{
  2. private volatile Singleton single=null;
  3. private Singleton(){}
  4. public static Singleton getInstance(){
  5. if(single==null)
  6. synchronized(Singleton.class){
  7. if(single==null)
  8. single=new Singleton();
  9. }
  10. return single;
  11. }
  12. }

5.内部类式
当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,从而创建Singleton的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。

  这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。

  1. public class Singleton{
  2. private Singleton(){}
  3. private static class InnerHoder{
  4. private static Singleton instance=new Singleton();
  5. }
  6. public static Singleton getInstance(){
  7. return InnerHoder.instance;
  8. }
  9. }

6.枚举式
1、 自由序列化;
2、 保证只有一个实例(即使使用反射机制也无法多次实例化一个枚举量)
3、 线程安全;

  1. public enum HelperSingleton {
  2. INSTANCE;
  3. private HelperSingleton(){
  4. }
  5. public Object[] buildObject(){
  6. final Object[] obj=new Object[2];
  7. obj[0]=new String("xxx");
  8. obj[1]=new Integer(555);
  9. return obj;
  10. }
  11. /**
  12. * 使用
  13. */
  14. public static void main(String[] args) {
  15. Object[] obj=HelperSingleton.INSTANCE.buildObject();
  16. }
  17. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注