java实现懒汉单例模式
时间: 2023-07-07 22:34:49 浏览: 71
懒汉单例模式是指在需要时才创建对象实例,而不是在类加载时就创建对象实例。下面是Java实现懒汉单例模式的示例代码:
```
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
在上述代码中,Singleton类的构造方法是私有的,因此外部无法直接创建对象实例。getInstance()方法是用来获取Singleton类的唯一实例的,它首先判断instance是否为null,如果为null则创建一个新的Singleton对象,否则直接返回已经存在的实例。
需要注意的是,由于懒汉单例模式在多线程环境下存在线程安全问题,因此在getInstance()方法中需要对instance进行线程同步,以保证多线程环境下仍然能够正确地返回Singleton实例。
为了保证线程安全性,可以通过synchronized关键字来实现线程同步,或者使用双重检查锁定机制(Double-Checked Locking),如下所示:
```
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
或者:
```
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
在第一种方式中,getInstance()方法被加上了synchronized关键字,以保证线程安全性。在第二种方式中,使用了双重检查锁定机制,即先判断instance是否为null,如果为null,则对Singleton类进行加锁,然后再次判断instance是否为null,如果仍为null,则创建一个新的Singleton对象。由于使用了volatile关键字,可以确保在多线程环境下,对instance的读取和写入操作都是原子性的,从而避免了线程安全问题。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)