java单例的另一种写法

java单例的另一种写法

阅读android源码时发现ActivityManager有一个单例的写法如下:

/**
     * @hide
     */
    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }

    private static final Singleton IActivityManagerSingleton =
            new Singleton() {
                @Override
                protected IActivityManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
                }
            };

Singleton这个类是源码android.util包里面打上@hide
代码路径:/frameworks/base/core/java/android/util/Singleton.java

package android.util;
/**
 * Singleton helper class for lazily initialization.
 *
 * Modeled after frameworks/base/include/utils/Singleton.h
 *
 * @hide
 */
public abstract class Singleton {
    private T mInstance;

    protected abstract T create();

    public final T get() {
        synchronized (this) {
            if (mInstance == null) {
                mInstance = create();
            }
            return mInstance;
        }
    }
}

下面我用kotlin来实现如上效果

abstract class SingletonV2 {

    private val mInstance: T by lazy(LazyThreadSafetyMode.SYNCHRONIZED)
    {
        create()
    }

    protected abstract fun create(): T

    fun get(): T {
        return mInstance
    }
}

如何使用?

private static final SingletonV2 singletonV2 = new SingletonV2() {

        @Override
        protected PKModel create() {
            return new PKModel();
        }
    };

    public static PKModel getInstance() {
        return singletonV2.get();
    }

这种单例写法的好处就是使用了线程安全,并且是双延迟

你可能感兴趣的:(java单例的另一种写法)