- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Jon 的 Skeet 在线页面上阅读了有关如何在 C# 中创建线程安全的单例
http://csharpindepth.com/Articles/General/Singleton.aspx
// 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;
}
}
}
在这段代码下面的段落中,它说:
As hinted at before, the above is not thread-safe. Two different threads could both have evaluated the test if (instance==null) and found it to be true, then both create instances, which violates the singleton pattern. Note that in fact the instance may already have been created before the expression is evaluated, but the memory model doesn't guarantee that the new value of instance will be seen by other threads unless suitable memory barriers have been passed.
您能解释一下为什么内存模型不能保证实例的新值会被其他线程看到吗?
静态变量位于堆上,但为什么不立即与其他线程共享?我们是否需要等待上下文切换,以便其他线程知道实例不再为空?
最佳答案
Can you please explain why doesn't the memory model does not guarantee that the new value of instance will be seen by other threads?
内存模型很复杂,目前还没有非常清楚地记录下来,但从根本上说,很少有情况可以安全地依赖一个线程写入的值在另一个线程上“看到”而没有一些锁定或其他正在进行线程间通信。
例如,考虑一下:
// Bad code, do not use
public class BigLoop
{
private static bool keepRunning = true;
public void TightLoop()
{
while (keepRunning)
{
}
}
public void Stop()
{
keepRunning = false;
}
}
如果您创建了两个线程,其中一个调用 TightLoop
,另一个调用 Stop
,则无法保证循环方法永远 终止。
现代 CPU 中有很多级别的缓存,要求每次读取都返回到主内存会消除很多优化。所以我们有内存模型来保证在什么情况下哪些变化肯定是可见的。除了这些保证之外,JIT 编译器还可以假设实际上只有一个线程 - 例如,它可以将字段的值缓存在寄存器中,并且再也不会访问主内存。
当前记录的内存模型严重不足,建议一些明显奇怪的优化应该是有效的。我不会沿着这条路走得太远,但值得阅读 Joe Duffy 在 CLR 2.0 memory model 上的博客文章. (这比文档化的 ECMA 内存模型更强大,但博客文章并不是此类关键文档的理想位置,我认为仍然需要更加清晰。)
The static variable is located on the heap, but why it is not shared with other threads?
它 与其他线程共享 - 但该值不一定立即可见。
关于c# - 线程安全单例 : why the memory model does not guarantee that the new instance will be seen by other threads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47816720/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!