JAVA的单例模式与延时加载
单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局的访问点,以便于对实例的访问。在一些情况下,我们希望在第一次使用该单例时才进行初始化,这时候就可以利用延时加载技术。
单例模式
在 JAVA 中,实现单例模式的方法有很多,这里介绍比较常用的两种实现方式。
饿汉式
饿汉式是指在类装载的时候就会进行初始化,比较简单直接,但是会浪费一定的内存空间,特别是在该单例未使用的情况下。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
在该类被加载的时候,就会对 instance
进行初始化,这也保证了在调用 getInstance
方法时,该单例是已经存在的,从而避免了多线程下的多次创建。
懒汉式
懒汉式是指在调用 getInstance
方法时才进行该单例的初始化,这样可以避免浪费内存空间,但是需要考虑线程安全的问题。
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
该实现方式使用了线程安全的技术,即在 getInstance
方法中使用了 synchronized 关键字进行同步,从而保证了多线程下的只有一个实例。
延时加载
在某些情况下,我们希望在实例化该单例时进行比较耗时的操作,如连接数据库等。这时候,我们可以采用延时加载的技术来实现该单例。
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;
}
}
在该实现中,我们使用了双重检查锁定(double-checked locking)的方式来实现该单例。在第一次调用 getInstance
方法时,会进入第一个 if
语句,如果该单例还未被创建,则会进行同步操作。在同步代码块中,再次判断该单例是否已经被创建,以避免创建多个实例。如果该单例已经被创建,则直接返回该单例。
总结
单例模式和延时加载都是常用的 JAVA 设计模式,它们在实际的开发中有着十分重要的作用。需要根据实际的应用场景来选择适用的实现方式。同时,需要注意线程安全的问题,保证单例的正确性和可靠性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA的单例模式与延时加载 - Python技术站