五种单例模式的Java与kotlin语言对比

1、饿汉式

java方式

/**
 * Description:饿汉式单例
 */
public class BaseSingleton {

    private BaseSingleton(){}

    private static final BaseSingleton INSTANCE = new BaseSingleton();

    public static BaseSingleton getInstance() {
        return INSTANCE;
    }
}
复制代码

kotlin方式

/**
 * Description:饿汉式单例
 * 在kotlin中饿汉式单例只需要一个object修饰即可
 */

object BaseSingleton {

}
复制代码

懒汉式

java 方式

/**
 * Description:懒汉式单例,最常用的一种,非线程安全
 */
public class LazyLoadSingleton {

    private LazyLoadSingleton() {

    }

    private static LazyLoadSingleton INSTANCE;

    public static LazyLoadSingleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new LazyLoadSingleton();
        }
        return INSTANCE;
    }
}
复制代码

kotlin 方式

/**
 * Description:懒汉式单例
 */

class LazyLoadSingleton private constructor() {

    /**
     * companion object相当于Java中的 public static 类似于静态代码块
     */
    companion object {

        //LazyThreadSafetyMode.NONE线程非安全  ——  对比与双重检测模式 LazyThreadSafetyMode.SYNCHRONIZED
        val INSTANCE by lazy(LazyThreadSafetyMode.NONE) {
            LazyLoadSingleton();
        }
    }
}
复制代码

同步加锁

java 方式

/**
 * Description:同步锁式单例
 * 优点:线程安全
 * 缺点:每次获取实例都会加锁
 */
public class LazySynchronizedSingleton {
    private LazySynchronizedSingleton() {

    }

    private static LazySynchronizedSingleton INSTANCE;

    public static synchronized LazySynchronizedSingleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new LazySynchronizedSingleton();
        }
        return INSTANCE;
    }
}
复制代码

kotlin 方式

/**
 * Description: 同步锁式单例
 * 优点:线程安全
 * 缺点:每次获取实例都会加锁
 */

class LazySynchronizedSingleton private constructor() {
    /**
     * companion object相当于Java中的 public static 类似于静态代码块
     */
    companion object {
        //kotlin中变量后面有?表示该变量可以为null
        private var INSTANCE : LazySynchronizedSingleton? = null

        /**
         * 在kotlin中通过注解方式加锁
         * !!表示非空判断
         */
        @Synchronized
        fun getInstance(): LazySynchronizedSingleton {
            if (INSTANCE == null) {
                INSTANCE = LazySynchronizedSingleton()
            }
            return INSTANCE!!
        }
    }
}
复制代码

双重检测式

java 方式

/**
 * Description:双重检测式单例
 * 优点:线程安全,不会重复加锁
 * 缺点:写法稍微复杂
 */
public class DoubleCheckSingleton {
    private DoubleCheckSingleton() {

    }

    private static volatile DoubleCheckSingleton INSTANCE;

    public static DoubleCheckSingleton getInstance() {
        if (INSTANCE == null) {
            synchronized (DoubleCheckSingleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new DoubleCheckSingleton();
                }
            }
        }
        return INSTANCE;
    }
}
复制代码

kotlin方式

/**
 * Description:双重检测式单例
 * 线程安全,不会重复加锁,代码简洁
 */
class DoubleCheckSingleton private constructor() {

    /**
     * companion object相当于Java中的 public static
     */
    companion object {
        val INSTANCE by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            DoubleCheckSingleton()
        }
    }
}
复制代码

内部类式

java 方式

/**
 * Description:内部类式单例
 * 优点:写法简单,代码少,既满足了懒加载又满足了线程安全
 */
public class InnerStaticSingleton {
    private InnerStaticSingleton() {

    }

    private static class Holder{
        private static InnerStaticSingleton INSTANCE = new InnerStaticSingleton();
    }

    public static InnerStaticSingleton getInstance() {
        return Holder.INSTANCE;
    }
}
复制代码

kotlin 方式

/**
 * Description:内部类式单例
 * 优点:代码少,线程安全
 */
class InnerStaticSingleton private constructor() {

    /**
     * 内部类
     */
    private object Holder {
        val INSTANCE = InnerStaticSingleton()
    }

    companion object {
        fun getInstance() = Holder.INSTANCE
    }
}
复制代码

参考

github.com/FynnJason/F…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值