Java单例模式的9种实现方式
时间:2023-06-29 11:07:00
文章目录
- Java9种实现单例模式的方法
-
-
-
- 一.饿汉式
- 二.懒汉式,线程不安全
- 三.懒汉式,线程安全
- 四.双检锁/双检锁(DCL,即 double-checked locking)
- 五.静态内部类
- 六.枚举
- 七.双检锁/双检锁(DCL,即 double-checked locking)(加volatile)
- 八.使用ThreadLocal实现单例
- 九.使用CAS锁实现单例
-
-
- 我的学习论坛
Java9种实现单例模式的方法
一.饿汉式
public class Singleton {
private static Singleton instance = new Singleton(); private Singleton (){
} public static Singleton getInstance() {
return instance; } }
JDK中,java.lang.Runtime使用饿汉单例模式是典型的
二.懒汉式,线程不安全
public class Singleton {
private static Singleton instance; private Singleton (){
} public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton(); } return instance; } }
三.懒汉式,线程安全
public class Singleton {
private static Singleton instance; private Singleton (){
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
四.双检锁/双重校验锁(DCL,即 double-checked locking)
JDK 版本:JDK1.5 起
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){
}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
五.静态内部类
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){
}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
六.枚举
JDK 版本:JDK1.5 起
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
七.双检锁/双重校验锁(DCL,即 double-checked locking)(加volatile)
JDK 版本:JDK1.5 起
public class Singleton {
# 使用volatile设置内存屏障,确保线程访问资源可见性。
private volatile static Singleton singleton;
private Singleton (){
}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
八.使用ThreadLocal实现单例
public class Singleton {
// 用空间换时间
private static final ThreadLocal<Singleton> tl = new ThreadLocal<Singleton>();
@Override
protected Singleton initialValue() {
return new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return tl.get();
}
}
九.使用CAS锁实现单例
private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<Singleton>();
private Singleton() {
}
public static final Singleton getInstance() {
for (; ; ) {
Singleton current = INSTANCE.get();
if (current != null) {
return current;
}
current = new Singleton();
if (INSTANCE.compareAndSet(null, current)) {
return current;
}
}
}
我的学习论坛
HandsomeForum:用Java编写的学习论坛,打造我们自己的圈子!(http://huangjunjie.vip:66)
文章链接:http://huangjunjie.vip:66/blog/read/8xb2zexvrhiii3anpq