懒加载-懒汉模式
- public class Singleton {
-
- private volatile static Singletoninstance;
-
- private Singleton() {
- }
-
- public static Singleton getInstance() {
- if (instance==null) { //第一次检查
- synchronized (Singleton.class) {
- if (instance==null) { //第二次检查
- instance=new Singleton();
- }
- }
- }
- return instance;
- }
- }
在上述代码中,使用双重检查锁实现了线程安全的单例模式。getInstance()方法首先检查instance是否为null,如果为null,则进入同步块。在同步块内部,再次检查instance是否为null,这是为了防止多个线程同时通过了第一次检查,然后一个线程创建了实例,而另一个线程又创建了一个实例的情况发生。
使用双重检查锁可以在保证线程安全的前提下,减少锁的竞争,提高性能。但需要注意的是,使用双重检查锁需要将instance声明为volatile类型,以确保多线程环境下的可见性。
预加载-饿汉模式
- public class Singleton {
-
- private static final Singleton instance = new Singleton();
- private Singleton(){
- }
- public static Singleton getInstance(){
- return instance;
- }
- }
静态内部类模式
- public class Singleton {
- private static class SingletonHolder {
- private static Singleton instance=new Singleton();
- }
- private Singleton(){}
-
- public static Singleton getInstance() {
- return SingletonHolder.instance;
- }
- }
枚举模式
- public enum Singleton {
- /**
- * 单例实例
- */
- INSTANCE;
-
- public void doSomeThing(){
- System.out.println("done");
- }
- }
单元素的枚举类型是实现 Singleton 的最佳方法