|
|
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。即使它更贵,它可能仍然不是真正的不安全。
|