双检锁单例模式的写法
时间: 2023-11-28 18:36:24 浏览: 60
双检锁/双重校验锁(DCL)是一种线程安全的懒汉式单例模式。其写法如下所示:
```java
public class Singleton {
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton() {
if(singleton == null) {
synchronized (Singleton.class) {
if(singleton == null)
singleton = new Singleton();
}
}
return singleton;
}
}
```
在这个例子中,使用了双重检查来保证只有在第一次调用`getSingleton()`方法时才创建实例。使用`volatile`关键字修饰`singleton`变量可以确保多个线程正确处理该变量的可见性和有序性。
相关问题
unity伪单例模式的写法
在 Unity 中实现伪单例模式,可以通过以下步骤进行:
1. 创建一个公共静态变量 instance,用于存储单例对象。
2. 在 Awake() 函数中判断 instance 是否为空,如果为空,则将当前对象赋值给 instance。
3. 在 Start() 函数中判断 instance 是否为空,如果为空,则销毁当前对象。
4. 在其他脚本中调用单例对象时,可以通过类名.instance的方式获取单例对象。
下面是示例代码:
```
public class Singleton : MonoBehaviour
{
public static Singleton instance;
private void Awake()
{
if (instance == null)
{
instance = this;
}
}
private void Start()
{
if (instance == null)
{
Destroy(gameObject);
}
}
}
```
在其他脚本中获取单例对象的方式如下:
```
Singleton singleton = Singleton.instance;
```
unity中实现伪单例的写法
在 Unity 中,有时候我们需要在多个场景(Scene)中使用同一个对象,但是又不希望使用单例模式,这时候可以使用伪单例模式。
伪单例模式的实现方式与单例模式类似,但是不需要将对象设置为全局唯一的,而是在每个场景中只创建一个实例,达到类似单例的效果。
下面是一个在 Unity 中实现伪单例的示例代码:
```csharp
public class MyPseudoSingleton : MonoBehaviour
{
private static MyPseudoSingleton instance;
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
```
在这个示例中,我们在 Awake 方法中检查 instance 是否为 null,如果是,就将当前实例赋值给 instance,并调用 DontDestroyOnLoad 方法,以便在场景切换时不被销毁。如果 instance 不为 null,说明已经存在 MyPseudoSingleton 实例了,我们就销毁当前实例。
使用时,我们在每个场景中都创建一个 MyPseudoSingleton 的对象,这样就能在多个场景中共享同一个对象了。这样,我们就实现了一个伪单例。