我一直在研究单例模式,但我不理解下面的代码是如何线程安全的:
public class ThreadSafeSingleton
{
private ThreadSafeSingleton()
{
}
public static ThreadSafeSingleton Instance
{
get { return Nested.instance; }
}
private class Nested
{
static Nested()
{
}
internal static readonly ThreadSafeSingleton instance = new ThreadSafeSingleton();
}
}为什么这个线程是安全的?
发布于 2015-03-29 13:57:10
CLR只执行一次静态构造函数。它被指定这样做。因此,instance只初始化一次。所以这条线很安全。
如何实现线程安全是一个实现细节。
发布于 2015-03-29 15:05:38
请在下面找到线程安全单例实现的实现。
此外,您还可以使用此问题。它提供双锁线程安全,不损害性能。
寻找静态这里的参考
查找参考这里
下面的代码不是线程安全的.两个不同的线程都可以评估测试if (instance==null),并发现它是真的,然后都创建实例,这违反了单例模式。注意,实际上实例可能已经在表达式计算之前创建了,但是内存模型并不保证其他线程会看到实例的新值,除非通过了适当的内存屏障。
非线程安全单例
// Bad code! Do not use!
public sealed class Singleton
{
private static Singleton instance=null;
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
} 线程安全实现:
公共密封类Singleton {私有静态Singleton实例= null;私有静态只读对象挂锁=新对象();
Singleton()
{
}
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}}
这个实现是线程安全的.线程取出共享对象的锁,然后在创建实例之前检查实例是否已经创建。这就解决了内存障碍问题(锁定确保所有读取都在锁获取之后逻辑上进行,而解除锁定则确保所有写入都在锁释放之前逻辑发生),并确保只有一个线程将创建实例(因为一次只有一个线程可以在代码的该部分中-到第二个线程进入它时,第一个线程将创建实例,因此表达式将计算为false)。不幸的是,每次请求实例时都会获得锁,从而影响性能。
https://stackoverflow.com/questions/29329886
复制相似问题