单例模式在Java开发中比较常见,它是一种设计模式,只允许创建一个实例对象,保证所有对该对象的访问都通过同一个实例。在实际开发中,单例模式可以用来管理全局变量、线程池、数据库连接池等资源,提高程序性能和稳定性。从不同的角度来看,单例模式有懒汉和饿汉两种实现方式。
懒汉模式
懒汉模式是指在需要使用实例对象时才进行创建,而不是在程序启动时就创建实例。这样做的好处是能够避免资源浪费,提高程序的性能。
懒汉模式实现的方式有多种,最简单的方式是只在第一次调用getInstance()时创建实例,如下所示:
```
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
```
这种实现方式虽然简单,但是存在线程安全性问题。当有多个线程同时调用getInstance()时,可能会导致多个实例被创建,从而违反了单例模式的原则。为了解决这个问题,可以使用双重检查锁定的方式,如下所示:
```
public class LazySingleton {
private static volatile LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
```
饿汉模式
饿汉模式是指在程序启动时就创建实例对象,而不需要在使用时再进行创建。这样做的好处是能够避免线程安全性问题,提高程序的稳定性。
饿汉模式的实现方式比较简单,如下所示:
```
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {}
public static HungrySingleton getInstance() {
return instance;
}
}
```
这种实现方式虽然避免了线程安全性问题,但是可能会存在资源浪费的问题。如果这个实例对象很大或者创建它需要很长时间,那么在程序启动时就创建它可能会导致程序的启动变慢。
比较
懒汉模式和饿汉模式各有优缺点,在实际开发中需要根据实际需求来选择合适的方式。下面是它们的比较。
1. 线程安全性
懒汉模式需要考虑线程安全性问题,否则可能会导致多个实例被创建。而饿汉模式则不存在这个问题,因为实例已经在程序启动时被创建。
2. 程序性能
在懒汉模式中,实例对象只在第一次使用时被创建,避免了资源浪费,提高了程序的性能。而在饿汉模式中,实例对象在程序启动时就被创建,可能会导致程序启动变慢,影响程序的性能。
3. 代码复杂度
为了保证懒汉模式的线程安全性,需要使用线程同步的方式,增加了代码的复杂度。而饿汉模式相对简单,没有这个问题。
扫码咨询 领取资料