饿汉式
/**
* 单例模式(饿汉式 - 类加载时主动创建实例)
* Created by Sheldon on 2019/10/26.
* Project Name: alstudy.
* Package Name: test2.
*/
public class Singleton {
// 静态初始化中创建单例实例,保证线程安全
private static Singleton uniqueInstance = new Singleton();
// 限制用户,使用户无法通过new方法创建对象
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}
懒汉式
- 线程不安全
/**
* 单例模式(懒汉式 - 检测到没实例时才创建实例)
* Created by Sheldon on 2019/10/26.
* Project Name: alstudy.
* Package Name: test2.
*/
public class Singleton {
private static Singleton uniqueInstance;
// 限制用户,使用户无法通过new方法创建对象
private Singleton(){}
public static Singleton getInstance(){
// 判断当前单例是否已创建,存在就返回,否则就创建后返回
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
- 线程安全
(在对应方法内使用synchronized关键字即可)
synchronized public static Singleton getInstance(){
// 判断当前单例是否已创建,存在就返回,否则就创建后返回
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
- 双重检查加锁版
(首先检查是否实例已经创建,如果尚未创建,“才”进行同步。这样以来,只有一次同步,这正是我们想要的效果。)
/**
* 单例模式(懒汉式)
* Created by Sheldon on 2019/10/26.
* Project Name: alstudy.
* Package Name: test2.
*/
public class Singleton {
volatile private static Singleton uniqueInstance;
// 限制用户,使用户无法通过new方法创建对象
private Singleton(){}
public static Singleton getInstance(){
// 判断当前单例是否已创建,存在就返回,否则就创建后返回
if (uniqueInstance == null){
synchronized (Singleton.class){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
- 登记式/内部静态类方式
(静态内部实现的单例是懒加载的且线程安全。)
通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance,意味着只有第一次使用这个单例的实例的时候才加载,同时不会有线程安全问题。
/**
* 单例模式(懒汉式 - 登记式/静态内部类方式)
* Created by Sheldon on 2019/10/26.
* Project Name: alstudy.
* Package Name: test2.
*/
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}