饿汉式
java
public class SingletonDemo{
private static SingletonDemo instance = new SingletonDemo();
private SingletonDemo(){}
public static SingletonDemo getInstance(){
return instance;
}
}
kotlin
object SingletonDemo
懒汉式
java
public class SingletonDemo{
private static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
instance = new SingletonDemo();
}
return instance;
}
}
kotlin
class SingletonDemo private constructor() {
companion object {
private var instance: SingletonDemo? = null
get() {
if (field == null) {
field = SingletonDemo()
}
return field
}
fun get(): SingletonDemo {
//这里不用 getInstance作为方法名,
//是因为在伴生对象声明时,内部已用getInstance方法
//所有只能取其他名字
return instance!!
}
}
}
线程安全的懒汉式
java
public class SingletonDemo{
private static SingletonDemo instance;
private SingletonDemo(){}
public static synchronized SingletonDemo getInstance(){
if(instance==null){
instance = new SingletonDemo();
}
return instance;
}
}
kotlin
class SingletonDemo private constructor() {
companion object {
private var instance: SingletonDemo? = null
get() {
if (field == null) {
field = SingletonDemo()
}
return field
}
@Synchronized
fun get(): SingletonDemo {
//这里不用 getInstance作为方法名,
//是因为在伴生对象声明时,内部已用getInstance方法
//所有只能取其他名字
return instance!!
}
}
}
双重校验锁式(Double Check)
java
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 (kotlin的延迟属性Lazy)
class SingletonDemo private constructor(){
companion object {
val instance:SingletonDemo by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
SingletonDemo() }
}
}
静态内部类式
java
public class SingletonDemo{
private static class SingletonHolder{
private static SingletonDemo instance = new SingletonDemo();
}
private SingletonDemo(){}
public static SingletonDemo getInstance(){
return SingletonHolder.instance;
}
}
kotlin
class SingletonDemo private constructor(){
companion object {
val instance = SingletonHolder.holder
}
private object SingletonHolder {
val holder = SingletonDemo()
}
}