Kotlin 的單例模式(5種)
Kotlin 的5種單例模式:
- 餓漢式
- 懶漢式
- 線程安全的懶漢式
- 雙重校驗(yàn)鎖式
- 靜態(tài)內(nèi)部類式
一上沐、餓漢式實(shí)現(xiàn)
特點(diǎn):在類創(chuàng)建的同時(shí)就已經(jīng)創(chuàng)建好一個(gè)靜態(tài)的對(duì)象供系統(tǒng)使用皮服,以后不再改變,所以天生是線程安全的参咙,調(diào)用效率高龄广,但是不能延時(shí)加載,占用內(nèi)存蕴侧。
- Java 的實(shí)現(xiàn)
//Java實(shí)現(xiàn)
public class SingletonDemo {
private static SingletonDemo instance=new SingletonDemo();
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
return instance;
}
}
- Kotlin的實(shí)現(xiàn)
object SingletonDemo
二择同、懶漢式
特點(diǎn):在第一次調(diào)用的時(shí)候?qū)嵗约海瑳]有考慮線程安全問題净宵,它是線程不安全的敲才,并發(fā)環(huán)境下很可能出現(xiàn)多個(gè)Singleton實(shí)例,要實(shí)現(xiàn)線程安全择葡。
- Java 的實(shí)現(xiàn)
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}
}
- Kotlin 的實(shí)現(xiàn)
class SingletonDemo private constructor() {
companion object {
private var instance: SingletonDemo? = null
get() {
if (field == null) {
field = SingletonDemo()
}
return field
}
fun get(): SingletonDemo{
//這里不用getInstance作為為方法名紧武,是因?yàn)樵诎樯鷮?duì)象聲明時(shí),內(nèi)部已有g(shù)etInstance方法刁岸,所以只能取其他名字
return instance!!
}
}
}
三缚陷、線程安全的懶漢式
特點(diǎn):線程安全处面,調(diào)用效率不高,第一次調(diào)用才初始化,避免內(nèi)存浪費(fèi)祝旷,須加鎖 synchronized 才能保證單例咽安,但加鎖會(huì)影響效率贪婉。
- Java的實(shí)現(xiàn)方式
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
public static synchronized SingletonDemo getInstance(){//使用同步鎖
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}
}
- Kotlin的實(shí)現(xiàn)方式
class SingletonDemo private constructor() {
companion object {
private var instance: SingletonDemo? = null
get() {
if (field == null) {
field = SingletonDemo()
}
return field
}
@Synchronized
fun get(): SingletonDemo{
return instance!!
}
}
}
四户辱、雙重校驗(yàn)鎖式(Double Check)
特點(diǎn):線程安全,這種方式采用雙鎖機(jī)制疏哗,安全且在多線程情況下能保持高性能呛讲。
- Java 的實(shí)現(xiàn)方式
public class SingletonDemo {
private volatile static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
synchronized (SingletonDemo.class){
if(instance==null){
instance=new SingletonDemo();
}
}
}
return instance;
}
}
- Kotlin 的實(shí)現(xiàn)方式
class SingletonDemo private constructor() {
companion object {
val instance: SingletonDemo by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
SingletonDemo() }
}
}
五、靜態(tài)內(nèi)部類式
特點(diǎn):這是官方推薦的。外部類加載時(shí)并不需要立即加載內(nèi)部類贝搁,內(nèi)部類不被加載則不去初始化INSTANCE吗氏,故而不占內(nèi)存。不僅能確保線程安全雷逆,也能保證單例的唯一性弦讽,同時(shí)也延遲了單例的實(shí)例化。
- Java的實(shí)現(xiàn)方式
public class SingletonDemo {
private static class SingletonHolder{
private static SingletonDemo instance=new SingletonDemo();
}
private SingletonDemo(){
System.out.println("Singleton has loaded");
}
public static SingletonDemo getInstance(){
return SingletonHolder.instance;
}
}
- Kotlin 的實(shí)現(xiàn)方式
class SingletonDemo private constructor() {
companion object {
val instance = SingletonHolder.holder
}
private object SingletonHolder {
val holder= SingletonDemo()
}
}