1. 饿汉式
poublic static singleton{
private static singleton instance = new singleton();
public singleton(){
}
public static singleton getInstance(){
return instance;
}
}
2.懒汉式
public class Singleton{
private static Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
3.懒汉+同步方法/同步块
同步方法:
public class Singleton{
private static Singleton instance;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
同步代码块:
public class Singleton{
private static Singleton instance;
private static Object obj = new Object();
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
synchronized(obj){
instance=new Singleton();
}
}
return instance;
}
}
4.双重检查
可能两个线程同时进入第一个if判断中,就创建了两次实例。
public class Singleton{
private static Singleton instance;
private static Object obj = new Object();
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
synchronized(obj){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
5.双重检查+violatile
双重检查可能由于指令重排序出问题,加violatile。
public class Singleton{
private static violatile Singleton instance;
private static Object obj = new Object();
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
synchronized(obj){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
6.静态内部类
public class Singleton{
private static class SingletonHolder{
private static Singleton instace = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instace;
}
}
7.枚举
关于枚举,我整理在这边:https://blog.csdn.net/u012156116/article/details/80352548
public enum EasySingleton {
INSTANCE;
}
使用时:
EasySingleton singleton = EasySingleton.valueOf("INSTANCE");