饿汉式单例模式如何保证线程安全
时间: 2023-11-28 11:34:50 浏览: 43
饿汉式单例模式可以通过在类加载时就创建实例的方式来保证线程安全。具体实现如下:
```java
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// 私有化构造函数,防止外部创建实例
}
public static Singleton getInstance() {
return instance;
}
}
```
在这个实现中,私有化了构造函数,使得外部无法直接创建实例。同时,将实例对象定义为静态变量,并且在类加载时即进行初始化,确保了在多线程环境下只会创建一个实例。
相关问题
java 饿汉式单例模式
饿汉式单例模式是一种创建单例对象的方式,它的特点是在类加载时就创建了单例对象,因此也被称为“静态单例模式”。
饿汉式单例模式的实现方式很简单,只需要在类中定义一个静态的、final的单例对象,然后提供一个静态的、公共的、不可修改的方法来获取这个单例对象,如下所示:
```
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
```
在上面的代码中,Singleton类的构造方法是私有的,这意味着外部无法直接创建Singleton对象。而getInstance()方法则返回了一个静态的、final的单例对象INSTANCE,这个对象在类加载时就已经被创建了。
饿汉式单例模式的优点是实现简单、线程安全,因为单例对象在类加载时就已经被创建了,所以不存在线程安全问题。但是它的缺点也很明显,那就是如果单例对象的构造方法中需要进行复杂的计算或者初始化,那么这个过程会影响类的加载速度,并且占用内存空间。
懒汉式单例模式和饿汉式单例模式的异同
以下是懒汉式单例模式和饿汉式单例模式的异同:
相同点:
1. 都是单例模式,即保证一个类只有一个实例对象。
2. 都使用了私有的构造函数,防止外部创建实例对象。
3. 都使用了静态变量来保存实例对象。
不同点:
1. 创建对象的时机不同:饿汉式在类加载时就创建了对象实例,而懒汉式是在使用时才创建。
2. 线程安全性不同:饿汉式天生是线程安全的,因为在类加载时就已经创建了对象实例,而懒汉式需要考虑线程安全问题,可以使用synchronized关键字或者双重检查锁定等方式来保证线程安全。
3. 性能不同:饿汉式在类加载时就创建了对象实例,所以在访问速度和反应时间上都比懒汉式快,但是如果这个实例一直没有被使用,那么就会造成内存浪费。而懒汉式只有在使用时才会创建对象实例,所以在内存占用上比饿汉式要低,但是在访问速度和反应时间上会稍微慢一些。
下面是懒汉式单例模式的示例代码:
```python
class Singleton:
__instance = None
def __init__(self):
if Singleton.__instance != None:
raise Exception("该类已经实例化过了")
else:
Singleton.__instance = self
@staticmethod
def getInstance():
if Singleton.__instance == None:
Singleton()
return Singleton.__instance
```
下面是饿汉式单例模式的示例代码:
```python
class Singleton:
__instance = Singleton()
def __init__(self):
if Singleton.__instance != None:
raise Exception("该类已经实例化过了")
else:
Singleton.__instance = self
@staticmethod
def getInstance():
return Singleton.__instance
```