Kotlin Singleton 单例模式

1 饿汉式

object Singleton {fun doSome1() {println("test")}
}

Kotlin 调用方式 Singleton.doSome1()

Java 调用方式 Singleton.INSTANCE.doSome1()

Android Studio 通过 Tools -> Kotlin -> Show Kotlin Bytecode 查看编译后的字节码,点 Decompile 转成反编译后的 Java 代码

//final 声明类不可变性
public final class Singleton {public static final Singleton INSTANCE;public final void doSome1() {String var1 = "test";boolean var2 = false;System.out.println(var1);}private Singleton() {}static {Singleton var0 = new Singleton();INSTANCE = var0;}
}
  • 可以看出是饿汉式的 Java 单例模式
  • 线程安全
  • 无法进行传参

2 懒汉式

//2.1 线程不安全
class Singleton private constructor() {companion object {private var instance: Singleton? = null@JvmStaticfun getInstance(): Singleton {if (instance == null) {instance = Singleton()}return instance as Singleton}}fun doSome1() {println("test")}
}
//2.1 反编译后的 Java 代码
public final class Singleton {private static Singleton instance;public static final Singleton.Companion Companion = new Singleton.Companion((DefaultConstructorMarker)null);public final void doSome1() {String var1 = "test";boolean var2 = false;System.out.println(var1);}private Singleton() {}// $FF: synthetic methodpublic Singleton(DefaultConstructorMarker $constructor_marker) {this();}@JvmStatic@NotNullpublic static final Singleton getInstance() {return Companion.getInstance();}public static final class Companion {@JvmStatic@NotNullpublic final Singleton getInstance() {if (Singleton.instance == null) {Singleton.instance = new Singleton((DefaultConstructorMarker)null);}return Singleton.instance;}private Companion() {}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}}
}
//2.2 线程安全,2.1 例子加上 @Synchronized 注解
class Singleton private constructor() {companion object {private var instance: Singleton? = null@JvmStatic@Synchronized // 加了 @Synchronized fun getInstance(): Singleton {if (instance == null) {instance = Singleton()}return instance as Singleton}}fun doSome1() {println("test")}
}
//2.2 反编译后的 Java 代码
public final class Singleton {private static Singleton instance;public static final Singleton.Companion Companion = new Singleton.Companion((DefaultConstructorMarker)null);public final void doSome1() {String var1 = "test";boolean var2 = false;System.out.println(var1);}private Singleton() {}// $FF: synthetic methodpublic Singleton(DefaultConstructorMarker $constructor_marker) {this();}//增加了 synchronized 关键字@JvmStatic@NotNullpublic static final synchronized Singleton getInstance() {return Companion.getInstance();}public static final class Companion {//增加了 synchronized 关键字@JvmStatic@NotNullpublic final synchronized Singleton getInstance() {if (Singleton.instance == null) {Singleton.instance = new Singleton((DefaultConstructorMarker)null);}return Singleton.instance;}private Companion() {}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}}
}
//2.3 kotlin get() 特性写法 
//线程安全
class Singleton private constructor() {companion object {private var instance: Singleton? = nullget() {if (field == null) {field = Singleton()}return field;}//Companion 里已经生成一个 private final Singleton getInstance 方法,所以改用 gainInstance 这个命名@JvmStatic@Synchronizedfun gainInstance(): Singleton? {return instance}}fun doSome1() {println("test")}
}
//2.3 反编译后的 Java 代码
public final class Singleton {private static Singleton instance;public static final Singleton.Companion Companion = new Singleton.Companion((DefaultConstructorMarker)null);public final void doSome1() {String var1 = "test";boolean var2 = false;System.out.println(var1);}private Singleton() {}// $FF: synthetic methodpublic Singleton(DefaultConstructorMarker $constructor_marker) {this();}@JvmStatic@Nullablepublic static final synchronized Singleton gainInstance() {return Companion.gainInstance();}public static final class Companion {private final Singleton getInstance() {if (Singleton.instance == null) {Singleton.instance = new Singleton((DefaultConstructorMarker)null);}return Singleton.instance;}private final void setInstance(Singleton var1) {Singleton.instance = var1;}@JvmStatic@Nullablepublic final synchronized Singleton gainInstance() {return ((Singleton.Companion)this).getInstance();}private Companion() {}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}}
}
//2.4 kotlin lazy 特性写法
//线程不安全
class Singleton private constructor(){companion object {@JvmStaticval instance by lazy(LazyThreadSafetyMode.NONE) {Singleton()}}
}
//2.4 反编译后的 Java 代码
public final class Singleton {@NotNullprivate static final Lazy instance$delegate;public static final Singleton.Companion Companion = new Singleton.Companion((DefaultConstructorMarker)null);private Singleton() {}static {instance$delegate = LazyKt.lazy(LazyThreadSafetyMode.NONE, (Function0)null.INSTANCE);}// $FF: synthetic methodpublic Singleton(DefaultConstructorMarker $constructor_marker) {this();}@NotNullpublic static final Singleton getInstance() {return Companion.getInstance();}public static final class Companion {/** @deprecated */// $FF: synthetic method@JvmStaticpublic static void instance$annotations() {}@NotNullpublic final Singleton getInstance() {Lazy var1 = Singleton.instance$delegate;Singleton.Companion var2 = Singleton.Companion;Object var3 = null;boolean var4 = false;return (Singleton)var1.getValue();}private Companion() {}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}}
}

3 双重检查锁

//3.1  @Volatile 注解
class Singleton private constructor() {companion object {@Volatileprivate var instance: Singleton? = null@JvmStaticfun getInstance(): Singleton {if (instance == null) {synchronized(this) {if (instance == null) {instance = Singleton()}}}return instance as Singleton}}fun doSome1() {println("test")}
}
//3.1 反编译后的 Java 代码
public final class Singleton {private static volatile Singleton instance;public static final Singleton.Companion Companion = new Singleton.Companion((DefaultConstructorMarker)null);public final void doSome1() {String var1 = "test";boolean var2 = false;System.out.println(var1);}private Singleton() {}// $FF: synthetic methodpublic Singleton(DefaultConstructorMarker $constructor_marker) {this();}@JvmStatic@NotNullpublic static final Singleton getInstance() {return Companion.getInstance();}public static final class Companion {@JvmStatic@NotNullpublic final Singleton getInstance() {if (Singleton.instance == null) {boolean var1 = false;boolean var2 = false;synchronized(this) {int var3 = false;if (Singleton.instance == null) {Singleton.instance = new Singleton((DefaultConstructorMarker)null);}Unit var5 = Unit.INSTANCE;}}return Singleton.instance;}private Companion() {}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}}
}
//3.2 kotlin lazy 特性写法
class Singleton private constructor() {companion object {@JvmStaticval instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {Singleton()}}
}
//3.2 反编译后的 Java 代码
public final class Singleton {@NotNullprivate static final Lazy instance$delegate;public static final Singleton.Companion Companion = new Singleton.Companion((DefaultConstructorMarker)null);private Singleton() {}static {instance$delegate = LazyKt.lazy(LazyThreadSafetyMode.SYNCHRONIZED, (Function0)null.INSTANCE);}// $FF: synthetic methodpublic Singleton(DefaultConstructorMarker $constructor_marker) {this();}@NotNullpublic static final Singleton getInstance() {return Companion.getInstance();}public static final class Companion {/** @deprecated */// $FF: synthetic method@JvmStaticpublic static void instance$annotations() {}@NotNullpublic final Singleton getInstance() {Lazy var1 = Singleton.instance$delegate;Singleton.Companion var2 = Singleton.Companion;Object var3 = null;boolean var4 = false;return (Singleton)var1.getValue();}private Companion() {}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}}
}

4 object 对象声明 和 companion object 伴生对象

class Singleton private constructor() {//伴生对象companion object {@JvmStatic //方便 java 调用fun getInstance(): Singleton {return SingletonInstanceHolder.instance}}//对象声明private object SingletonInstanceHolder {val instance = Singleton()}fun doSome1() {println("test")}
}
//4 反编译后的 Java 代码
public final class Singleton {public static final Singleton.Companion Companion = new Singleton.Companion((DefaultConstructorMarker)null);public final void doSome1() {String var1 = "test";boolean var2 = false;System.out.println(var1);}private Singleton() {}// $FF: synthetic methodpublic Singleton(DefaultConstructorMarker $constructor_marker) {this();}@JvmStatic@NotNullpublic static final Singleton getInstance() {return Companion.getInstance();}private static final class SingletonInstanceHolder {@NotNullprivate static final Singleton instance;public static final Singleton.SingletonInstanceHolder INSTANCE;@NotNullpublic final Singleton getInstance() {return instance;}static {Singleton.SingletonInstanceHolder var0 = new Singleton.SingletonInstanceHolder();INSTANCE = var0;instance = new Singleton((DefaultConstructorMarker)null);}}public static final class Companion {@JvmStatic@NotNullpublic final Singleton getInstance() {return Singleton.SingletonInstanceHolder.INSTANCE.getInstance();}private Companion() {}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部