单例模式是一种创建型模式,单例类只允许有一个实例。
1.懒汉式,线程不安全
/**
* 懒汉式 线程不安全
*/
class Singleton1{
private static Singleton1 instance;
private Singleton1(){}
public static Singleton1 getInstance(){
if(instance == null){
instance = new Singleton1();
}
return instance;
}
}
2.懒汉式,线程安全
/**
* 懒汉式 线程安全
*/
class Singleton2{
private static Singleton2 instance;
private Singleton2(){}
public static synchronized Singleton2 getInstance(){
if(instance == null){
instance=new Singleton2();
}
return instance;
}
}
相比第一种实现方式,该方式在获取实例的方法上加上了synchronized关键字
3.双重校验(懒加载、线程安全)
/**
* 双重校验锁(懒加载、线程安全)
*/
class Singleton3{
private static Singleton3 instance;
private Singleton3(){};
public static Singleton3 getInstance(){
if(instance == null){
synchronized (Singleton3.class){
if(instance == null){
instance=new Singleton3();
}
}
}
return instance;
}
}
这个版本较之上个版本性能更好,不用每次获取实例都要获取锁,双重校验避免重复创建实例。
4.饿汉式(非懒加载,线程安全)
/**
* 饿汉式(非懒加载,线程安全)
*/
class Singleton4{
private static Singleton4 instance = new Singleton4();
private Singleton4(){};
public static Singleton4 getInstance(){
return instance;
}
}
5.内部类实现(懒加载,线程安全)
/**
* 内部类(懒加载,线程安全)
*/
class Singleton5{
private Singleton5(){};
private static final class SingletonInner{
private static final Singleton5 INSTANCE = new Singleton5();
}
public static final Singleton5 getInstance(){
return SingletonInner.INSTANCE;
}
}
6.枚举实现(非懒加载,线程安全)
/**
* 枚举(非懒加载,线程安全)
*/
enum Singleton6{
INSTANCE;
public void fun1(){
System.out.println("嘿嘿嘿");
}
}
public static void main(String[] args) {
Singleton6.INSTANCE.fun1();
}
枚举实现是最简单最好的实现单例模式的方式,值得一提的是它天然的可以防止序列化所造成的实例不唯一的问题。