Java多线程中单例模式是一种常见的设计模式,其中最常见的实现方式是懒汉式和饿汉式两种。这里将详细讲解这两种实现方式的完整攻略。
懒汉式实现单例模式
懒汉式实现单例模式的核心思想是:在第一次使用该单例对象时再进行实例化,而不是在类加载时就进行实例化。具体实现方式如下:
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
上述代码中,使用了双重检查锁定,保证了多线程环境下的安全性。但是该实现方式并非完美,因为由于Java内存模型的问题,DCL(Double-checked locking)存在问题,可能会导致实例化失败或者多次实例化等问题。
饿汉式实现单例模式
饿汉式实现单例模式的核心思想是:在类加载时就进行实例化,而不是在第一次使用时再实例化。具体实现方式如下:
public class Singleton {
private static Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
上述代码中,在Singleton类的私有静态成员变量INSTANCE中直接实例化Singleton类对象。由于在类加载时就实例化了该对象,因此在多线程环境下也可以保证其唯一性。
示例说明
下面的代码将演示如何在多线程环境下使用懒汉式和饿汉式实现单例模式:
public class SingletonDemo {
public static void main(String[] args) {
//懒汉式实现单例模式,在多线程环境下可能会出现并发问题
Runnable lazy = () -> System.out.println(Singleton.getInstance().hashCode());
Thread t1 = new Thread(lazy);
Thread t2 = new Thread(lazy);
t1.start();
t2.start();
//饿汉式实现单例模式,在多线程环境下没有并发问题
Runnable hungry = () -> System.out.println(Singleton.getInstance().hashCode());
Thread t3 = new Thread(hungry);
Thread t4 = new Thread(hungry);
t3.start();
t4.start();
}
}
上述代码中,演示了两种实现方式在多线程环境下的使用方式,并且演示结果显示饿汉式实现单例模式比懒汉式实现单例模式更为稳定。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程中的单例模式两种实现方式 - Python技术站