下面我来详细讲解Java中的八种单例创建方式的完整攻略。
标题
一、单例模式概述
单例模式是设计模式中常见的一种,用于保证一个类仅有一个实例,并提供一个全局的访问点进行访问。
二、Java中八种单例创建方式
1. 饿汉式
饿汉式是最基本的实现方式,它在类加载的时候就创建了对象实例。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
示例说明:
public class Demo {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
System.out.println(instance);
}
}
2. 懒汉式
懒汉式是最常用的实现方式,它在需要进行访问时才创建对象实例。
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
示例说明:
public class Demo {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
System.out.println(instance);
}
}
3. 静态内部类
静态内部类方式是一种比较优雅的方式,它既能够实现懒加载,又能够保证线程安全。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
示例说明:
public class Demo {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
System.out.println(instance);
}
}
4. 枚举方式
枚举方式是JDK5之后新增的一种方式,它比较简单,并且天生就是单例的。
public enum Singleton {
INSTANCE;
}
示例说明:
public class Demo {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
System.out.println(instance);
}
}
5. 双重校验锁
双重校验锁方式是一种比较常用的实现方式,它能够实现懒加载,并且保证了线程安全。
public class Singleton {
private volatile static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
示例说明:
public class Demo {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
System.out.println(instance);
}
}
6. ThreadLocal方式
ThreadLocal方式是一种比较少用的实现方式,它的实例是线程局部的。
public class Singleton {
private static final ThreadLocal<Singleton> threadLocalInstance =
ThreadLocal.withInitial(Singleton::new);
private Singleton() {}
public static Singleton getInstance() {
return threadLocalInstance.get();
}
}
示例说明:
public class Demo {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
System.out.println(instance);
}
}
7. CAS方式
CAS方式是一种比较高级的实现方式,它利用了Java的原子操作来保证线程安全。
public class Singleton {
private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<>();
private Singleton() {}
public static Singleton getInstance() {
for (;;) {
Singleton singleton = INSTANCE.get();
if (singleton != null) {
return singleton;
}
singleton = new Singleton();
if (INSTANCE.compareAndSet(null, singleton)) {
return singleton;
}
}
}
}
示例说明:
public class Demo {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
System.out.println(instance);
}
}
8. 操作系统名方式
操作系统名方式是一种比较神奇的实现方式,它利用了操作系统的特性来保证单例。
public class Singleton {
private static Singleton instance = null;
static {
String osName = System.getProperty("os.name");
if (osName.equals("Windows 10")) {
instance = new Singleton();
}
}
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
示例说明:
public class Demo {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
System.out.println(instance);
}
}
三、总结
本文介绍了Java中的八种单例创建方式,并对每种方式进行了详细的讲解和示范,希望能够帮助大家深入理解单例模式的实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java中的八种单例创建方式 - Python技术站