单例模式的两种完美写法

单例模式的写法有多种最简单的就是懒汉式的写法,但是懒汉式的写法在多线程中会出问题。下面总结写我常用的两种写法。

1. 使用volatile 关键字声明写法

    public class SignalDemo1 {       

        public static volatile SignalDemo1 instance;

        private SignalDemo1()  {

      }

      public static SignalDemo1 getInstance( ){

        if( instance == null) {

              synchronized (SignalDemo1.class) {

                if (instance == null) {

                    instance = new SignalDemo1();

                }

            }

      }

        return instance;

    }

}

    这种写法的好处就是不会在多线程中调用getInstance()方法出现多实例的特殊情况。也是我经常使用的。下面的写法是 Effect Java 第一版中的单例写法,我感觉写的很巧妙。第二版中用的枚举类型,虽然代码更加精简但是不容易理解。这里以第一版的写法为主。

2. Effect Java 第一版推荐的单例模式写法

    public class SingleDemo2 {

      private SingleDemo2( ){

    }

    private static class SingleHolder{

        private static finale SingleDemo2 instance = new SingleDemo2( );

    }

    public static SingelDemo2 getInstance ( ){

          return SingleHolder.instance;

    }

}

    这种写法的好处是巧妙的利用了静态内部类。

你可能感兴趣的:(单例模式的两种完美写法)