主要單例模式實現如下:
- 餓漢式
- 懶漢式
- 線程安全的懶漢式
- 雙重校驗鎖式
- 靜態內部類式
一,餓漢式實現
(1)java惡漢式
public class Singleton{
public static final Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
(2)Kotlin餓漢式
//kotlin單例
object Singleton{
}
二,懶漢式實現
(1)java懶漢式
//Java實現
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
(2)kotlin懶漢式
//Kotlin實現
class Singleton private constructor() {
companion object {
private var instance: Singleton? = null
get() {
if (field == null) {
field = Singleton()
}
return field
}
fun get(): Singleton {
return instance!!
}
}
}
三,線程安全的懶漢式
(1)java線程安全的懶漢式
//Java實現
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){//使用同步鎖
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
(2)kotlin線程安全的懶漢式
//Kotlin實現
class Singleton private constructor() {
companion object {
private var instance: Singleton? = null
get() {
if (field == null) {
field = Singleton()
}
return field
}
@Synchronized //引入 org.jetbrains.kotlin:kotlin-stdlib-jdk7
fun get(): Singleton{
return instance!!
}
}
}
四,雙重校驗鎖式
(1)java雙重校驗鎖式
//Java實現
public class Singleton {
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
(2)kotlin雙重校驗鎖式
//kotlin實現
class Singleton private constructor() {
companion object {
val instance: Singleton by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
Singleton()
}
}
}
五,靜態內部類式
(1)java靜態內部類式
//Java實現
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton() {
System.out.println("Singleton has loaded");
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
(2)kotlin靜態內部類式
//kotlin實現
class Singleton private constructor() {
companion object {
val instance = SingletonHolder.holder
}
private object SingletonHolder {
val holder = Singleton()
}
}