java 单例
- 饿汉式单例模式:与 C# 中的实现方式相似,在程序启动时就创建单例对象,并在整个程序运行期间使用该对象。该方式比较简单,但是可能会影响程序的性能,因为即使不需要使用该对象,它也会一直存在于内存中。
以下是一个使用饿汉式单例模式的示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
- 懒汉式单例模式:与 C# 中的实现方式相似,在需要使用单例对象时才创建单例对象。需要注意的是,在多线程的环境中需要考虑线程安全问题。
以下是一个使用懒汉式单例模式的示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
该实现方式在单线程的环境中是可行的,但是在多线程的环境中会有并发安全问题,因为多个线程可能同时调用 getInstance
方法,导致创建多个实例。可以通过加锁的方式解决该问题,但是会影响程序的性能。为了避免这种情况,可以使用双重检查锁定或者静态内部类的方式实现懒汉式单例模式。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Singleton { private static volatile Singleton instance; private Singleton() { // private constructor } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
在上面的实现方式中,volatile
关键字确保 instance
变量对所有线程可见,并避免了指令重排序导致的线程安全问题。synchronized
关键字用于确保在同一时间只有一个线程能够创建单例对象,从而避免了多个线程同时创建对象的问题。双重检查锁定能够确保在高并发环境下保持单例对象的唯一性,并且避免了不必要的同步操作,以提高程序性能。