1
24
如果两个线程运行
|
2
8
因为Singleton不提供对\u实例属性的互斥。 锁
这个例子是C#-我不知道你用的是哪种编程语言。 http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.90).aspx |
3
5
根据RPM1984的回答:
或者只是
对于你们当中的表演大师:
顺便说一句:这就是所谓的双锁单例模式。 |
4
3
因为有可能
倍数
|
5
1
所以最好的解决办法是
有什么想法或意见吗? 进一步阅读我发现:
至于Java,它也应该起作用:
现在如果有人指出一个保存C++版本,它将是完整的…(我离开C++太长了,无法记住细节……) |
6
0
我认为在Java中,只需向getInstance方法添加一个synchronized标志就足够了。这将防止另一个线程在方法中时进入该方法。 |
7
0
最大的问题是,检查实例是否已经存在以及它的延迟初始化不是原子操作。 最简单的例子是线程A检查条件,然后将其返回给线程B;线程B检查相同的条件,并创建一个新对象并返回该新对象;线程B然后将其返回给线程A,线程A从停止的位置开始;线程A然后继续创建一个新对象并返回该对象。 还有一些值得注意的问题:
|
8
0
If TheSingleton Is Nothing Then Dim newSingleton As New Singleton If Interlocked.CompareExchange(TheSingleton, newSingleton, Nothing) IsNot Nothing Then newSingleton.Dispose ' If applicable End If End If 如果两个线程在进行比较交换之前通过了“If”测试,那么将创建两个单例。但是,只有传递给CompareExchange的第一个单例将被用于任何事情;另一个将被丢弃。 |
9
0
如果多个线程在第一个线程写入\u实例之前(实际上,可能在第一个线程写入\u实例之后,但在第二个线程的CPU将新值加载到其缓存之前)执行null检查,那么第二个线程(以及第三个和第四个…)将创建一个新实例并将其写入\u实例。 在垃圾收集语言中,这只是意味着在一段时间内,多个线程将有自己的\u实例版本,但很快它们就会退出作用域并有资格进行垃圾收集。 现在,这是浪费,但它是否真的是一个问题取决于创建一个新实例的成本有多高,以及存在多个实例是否会产生任何负面后果。通常情况下,这种不必要的实例对象复制的负面影响很小,在这种情况下,它的负面影响可能小于锁定的成本(锁定相对便宜,但不是免费的,等待锁定可能会非常昂贵,在某些情况下[死锁是最极端的情况]会非常昂贵),甚至是CASsing。即使它更贵,它可能仍然不是真正的不安全。
|
Eric · fgets_unlocked()用于多线程读取不同文件 2 年前 |
RoyGNEU · 堆上的专用std::Vector是线程安全的吗? 2 年前 |
JaiK · 在c中使用线程或队列写入文件# 6 年前 |
Catalin Ghita · 如何以安全线程对象为值初始化哈希表? 6 年前 |
Juan JuezSarmiento · C++删除对象,是否锁定? 6 年前 |
Missa · 两个不同线程正在处理原子NSMutableArray 6 年前 |
user5682282 · 从其他线程读取值 6 年前 |