package com.example.demo.test01;
/**
* 静态内部类实现单例
*/
public class Singleton01 {
/**
* 静态内部类
*/
private static class Singleton01Holder{
private static final Singleton01 INSTANCE=new Singleton01();
}
private Singleton01(){}
public static Singleton01 getInstance(){
return Singleton01Holder.INSTANCE;
}
}
package com.example.demo.test01;
/**
* 饿汉式单例
*/
public class Singleton02 {
private static Singleton02 instance=new Singleton02();
//私有构造器
private Singleton02(){}
public static Singleton02 getInstance(){
return instance;
}
}
package com.example.demo.test01;
/**
* 变种的饿汉式单例模式
*/
public class Singleton03 {
private static Singleton03 instance=null;
{
instance=new Singleton03();
}
private Singleton03(){}
public static Singleton03 getInstance(){
return instance;
}
}
package com.example.demo.test01;
/**
* 枚举单例
*/
public enum Singleton04 {
INSTANCE;
}
package com.example.demo.test01;
import java.util.concurrent.atomic.AtomicReference;
/**
* CAS实现单例
*/
public class Singleton05 {
private static final AtomicReference<Singleton05> INSTANCE=new AtomicReference<>();
private Singleton05(){}
public static Singleton05 getInstance(){
for(;;){
Singleton05 singleton=INSTANCE.get();
if(null!=singleton){
return singleton;
}
singleton=new Singleton05();
if(INSTANCE.compareAndSet(null,singleton)){
return singleton;
}
}
}
}
package com.example.demo.test01;
/**
* 使用synchronized实现单例
*/
public class Singleton06 {
private static volatile Singleton06 singleton=null;
//构造器私有
private Singleton06(){}
public static Singleton06 getInstance(){
if(singleton!=null){
synchronized (Singleton06.class){
if(singleton!=null){
singleton=new Singleton06();
}
}
}
return singleton;
}
}
package com.example.demo.test01;
/**
* 使用ThreadLocal实现单例
*/
public class Singleton07 {
private static final ThreadLocal<Singleton07> singleton=new ThreadLocal<Singleton07>(){
@Override
protected Singleton07 initialValue(){
return new Singleton07();
}
};
public static Singleton07 getInstance(){
return singleton.get();
}
private Singleton07(){}
}