首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程安全是什么意思?

线程安全是什么意思?
EN

Stack Overflow用户
提问于 2015-03-29 13:48:08
回答 2查看 93关注 0票数 1

我一直在研究单例模式,但我不理解下面的代码是如何线程安全的:

代码语言:javascript
复制
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();
    }
}

为什么这个线程是安全的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-29 13:57:10

CLR只执行一次静态构造函数。它被指定这样做。因此,instance只初始化一次。所以这条线很安全。

如何实现线程安全是一个实现细节。

票数 3
EN

Stack Overflow用户

发布于 2015-03-29 15:05:38

请在下面找到线程安全单例实现的实现。

此外,您还可以使用此问题。它提供双锁线程安全,不损害性能。

寻找静态这里的参考

查找参考这里

下面的代码不是线程安全的.两个不同的线程都可以评估测试if (instance==null),并发现它是真的,然后都创建实例,这违反了单例模式。注意,实际上实例可能已经在表达式计算之前创建了,但是内存模型并不保证其他线程会看到实例的新值,除非通过了适当的内存屏障。

非线程安全单例

代码语言:javascript
复制
// 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;私有静态只读对象挂锁=新对象();

代码语言:javascript
复制
Singleton()
{
}

public static Singleton Instance
{
    get
    {
        lock (padlock)
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

}

这个实现是线程安全的.线程取出共享对象的锁,然后在创建实例之前检查实例是否已经创建。这就解决了内存障碍问题(锁定确保所有读取都在锁获取之后逻辑上进行,而解除锁定则确保所有写入都在锁释放之前逻辑发生),并确保只有一个线程将创建实例(因为一次只有一个线程可以在代码的该部分中-到第二个线程进入它时,第一个线程将创建实例,因此表达式将计算为false)。不幸的是,每次请求实例时都会获得锁,从而影响性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29329886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档