两种单例实现方式
单例模式是指一个类只有一个实例,并且提供了一个全局的访问点来访问该实例。单例模式是一种常用的设计模式,它可以确保某个类只有一个实例,并且提供了一个全局的访问点来访问该实例。
在 Java 中,单例模式可以通过两种方式来实现:类加载时进行对象的实例化和第一次访问时进行对象的实例化。
类加载时进行对象的实例化
在这种方式下,单例对象是在类加载时实例化的。下面是一个简单的示例代码:
```java
public class SingletonA {
// SingletonA 的唯一实例
private static SingletonA instance = new SingletonA();
// 将构造函数私有,防止外界构造 SingletonA 实例
private SingletonA() {}
/
* 获取 SingletonA 的实例
*/
public static SingletonA getInstance() {
return instance;
}
}
```
在上面的代码中,我们定义了一个 SingletonA 类,并在类加载时实例化了 SingletonA 对象。在 getInstance() 方法中,我们直接返回了该实例。
这种方式的优点是:
* 简洁易懂:这种方式非常简单易懂,易于理解和维护。
* 高效:类加载时实例化单例对象,可以避免多次实例化对象。
然而,这种方式也存在一些缺点:
* 不灵活:这种方式不灵活,无法根据需要动态的实例化单例对象。
* 资源浪费:如果单例对象在整个应用程序中都未被使用,那么这种方式就会浪费资源。
第一次访问时进行对象的实例化
在这种方式下,单例对象是在第一次访问时实例化的。下面是一个简单的示例代码:
```java
public class SingletonB {
// SingletonB 的唯一实例
private static SingletonB instance = null;
// 将构造函数私有,防止外界构造 SingletonB 实例
private SingletonB() {}
// 获取 SingletonB 的唯一实例,用 synchronized 关键字保证某一时刻只有一个线程调用此方法。
public static synchronized SingletonB getInstance() {
// 如果 instance 为空,便创建一个新的 SingletonB 实例,否则,返回已有的实例
if (instance == null) {
instance = new SingletonB();
}
return instance;
}
}
```
在上面的代码中,我们定义了一个 SingletonB 类,并在第一次访问时实例化 SingletonB 对象。在 getInstance() 方法中,我们使用 synchronized 关键字来确保线程安全。
这种方式的优点是:
* 灵活:这种方式可以根据需要动态的实例化单例对象。
* 节约资源:这种方式可以避免资源浪费,因为只有在第一次访问时才实例化单例对象。
然而,这种方式也存在一些缺点:
* complex:这种方式比类加载时进行对象的实例化要复杂一些。
*syncronized 关键字可能会带来性能问题:在高并发环境下,synchronized 关键字可能会导致性能问题。
两种单例实现方式都有其优缺,选择哪种方式取决于实际应用场景和需求。