单例的5种实现(面试用)
程序员文章站
2022-06-03 15:10:03
...
单例模式确保每个类只有一个实例
实现方式
-
饿汉(立即加载):线程安全,做不到延迟加载
-
懒汉(延迟加载):能够做到延迟加载,加了Synchronized保证了线程安全
-
双重检测锁:是懒汉的加强版,将Synchronized关键字放到了newInstance里,同时singleton对象加上了volatile,避免了线程安全问题。但是volatile关键字有一些性能问题,不建议大量使用
-
静态内部类:通过内部类的机制是单例可以延迟加载,线程安全
-
枚举类
代码实现
//饿汉实现
public class Singleton {
private static Singleton singleton= new Singleton();
private singleton() {
}
public static Singleton newInstance() {
return singleton;
}
}
//懒汉实现
public class Singleton{
private static Singleton singleton;
private Singleton() {
}
public synchronized static Single newInstance() {
if (singleton== null) {
singleton= new Singleton();
}
return singleton;
}
}
//双重检测锁
public class Singleton{
private static Singleton singleton;
private Singleton() {
}
public static Single newInstance() {
if (singleton== null) {
synchronized(Singleton.class){
if(singleton==null){
singleton= new Singleton();
}
}
}
return singleton;
}
}
//静态内部类
public class Singleton {
private static class SingletonHolder {
private static Singleton singleton = new Singleton();
}
private Singleton() {
}
public static Singleton newInstance() {
return SingletonHolder.singleton;
}
}
//枚举
public enum Singleton {
singleton
}
学习中,有不正确的地方多多指教