Java单例模式双重检查锁(Double-Checked Locking)是一种用于实现单例模式的机制,它使用了一种称为双重检查锁定(double-checked locking)的技术来保证多线程情况下单例对象的唯一性。
双重检查锁定是一种优化同步的方法,它允许在多线程情况下减少同步开销。它通过使用两个if语句来减少同步的开销。在多线程情况下,如果多个线程同时进入if语句块中,则只有一个会首先执行if语句块中的代码。
Java中使用双重检查锁定来实现单例模式时,必须将单例对象声明为volatile 类型。volatile 关键字能够保证对象在多个线程间的可见性,也就是当一个对象被修改时,所有其他正在使用这个对象的地方都能立刻看到修改的效果。
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); //instance 不是 volatile 类型时, 这里会重新创建新的对象, 导致出问题. } } } return instance; } }
单例模式是一种创建模式。
这种模式只涉及一个单独的类,它负责创建自己的对象。
该类确保只创建单个对象。
这个类提供了一种访问其唯一对象的方法。
例如,当设计一个用户界面时,我们可能只有一个主应用程序窗口。我们可以使用Singleton模式来确保只有一个MainApplicationWindow对象的实例。
下面的代码将创建一个MainWindow类。
MainWindow类的构造函数是私有的,并且有一个自身的静态实例。
MainWindow类提供了一个静态方法来获取它的静态实例到外部世界。
Main,我们的演示类将使用MainWindow类来获取一个MainWindow对象。
class MainWindow { //create an object of MainWindow private static MainWindow instance = new MainWindow(); //make the constructor private so that this class cannot be //instantiated by other class private MainWindow(){} //Get the only object available public static MainWindow getInstance(){ return instance; } public void showMessage(){ System.out.println("Hello World!"); } } public class Main { public static void main(String[] args) { //Get the only object available MainWindow object = MainWindow.getInstance(); //show the message object.showMessage(); } }
上面的代码生成以下结果。
Java设计模式 - 数据访问对象模式数据访问对象模式或DAO模式将数据访问API与高级业务服务分离。DAO模式通常具有以下接口和类。数...
Java面向对象设计 -Java方法返回修饰符,返回类型和参数名称不是签名的一部分。方法的签名唯一地标识类中的方法。不允许在具有相...
Java面向对象设计 -Java final关键字final关键字不允许修改或替换其原始值或定义。final关键字可以在以下三个上下文中使用:变量...
Java面向对象的设计 -Java 内部类什么是内部类?作为包的成员的类被称为顶级类。一个类可以在另一个类中声明。这种类型的类称为...