接下来我会详细讲解“JAVA多线程并发下的单例模式应用”的完整攻略,包括两个示例说明来帮助理解。
单例模式
单例模式是设计模式中的一种,它保证某个类只有一个实例,并提供一个全局访问点供其他类访问该实例。在多线程并发环境下,单例模式的实现方式需要特别注意线程安全性问题,否则会导致实例化多个对象,违背了单例模式的初衷。
懒汉式单例模式
懒汉式单例模式是指在第一次获取实例的时候才进行实例化,该实现方式是线程不安全的,如下代码示例:
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
在多线程并发下,由于没有进行加锁,有可能会导致多个线程同时进入if语句中,最终导致实例化多个对象。
双重检验锁单例模式
为了避免懒汉式单例模式的线程安全问题,可以使用双重检验锁单例模式。
public class DoubleCheckSingleton {
private static volatile DoubleCheckSingleton instance;
private DoubleCheckSingleton() {}
public static DoubleCheckSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckSingleton.class) {
if (instance == null) {
instance = new DoubleCheckSingleton();
}
}
}
return instance;
}
}
双重检验锁的原理是在getInstance方法中先判断instance是否为null,如果为null则进行加锁,进入synchronized代码块后需要再次判断instance是否为null,确保只有一个线程进行实例化操作,并最终返回单例对象。
示例说明
下面通过两个示例来说明多线程并发下的单例模式应用。
示例1:双重检验锁单例模式
public class SingletonRunnable implements Runnable {
@Override
public void run() {
DoubleCheckSingleton instance = DoubleCheckSingleton.getInstance();
System.out.println(Thread.currentThread().getName() + " 获取到的单例实例:" + instance);
}
}
public class DoubleCheckSingletonTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(new SingletonRunnable()).start();
}
}
}
上述代码中,我们创建了5个线程,每个线程通过getInstance方法来获取DoubleCheckSingleton实例。由于使用了双重检验锁单例模式,多个线程获取到的实例对象是相同的,证明我们的双重检验锁单例模式是线程安全的。
示例2:懒汉式单例模式
public class SingletonRunnable implements Runnable {
@Override
public void run() {
LazySingleton instance = LazySingleton.getInstance();
System.out.println(Thread.currentThread().getName() + " 获取到的单例实例:" + instance);
}
}
public class LazySingletonTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(new SingletonRunnable()).start();
}
}
}
上述代码中,我们创建了5个线程,每个线程通过getInstance方法来获取LazySingleton实例。由于使用了懒汉式单例模式,多个线程获取到的实例对象可能是不同的,证明我们的懒汉式单例模式是线程不安全的。
以上就是详细的“JAVA多线程并发下的单例模式应用”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA多线程并发下的单例模式应用 - Python技术站