java单例的另一种写法

java单例的另一种写法

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

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

    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @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<T> {
    private T mInstance;

    protected abstract T create();

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

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

abstract class SingletonV2<T> {

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

    protected abstract fun create(): T

    fun get(): T {
        return mInstance
    }
}

如何使用?

private static final SingletonV2<PKModel> singletonV2 = new SingletonV2<PKModel>() {

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。