![]() |
1
6
该字段将只初始化一次,因此您将始终获得相同的对象。非常安全。 当然,在使用来自多个线程的静态对象时必须小心。如果对象不是线程安全的,您应该在从不同的线程访问它之前锁定它。 |
![]() |
2
6
是的,它是安全的——最简单的安全单例实现。 作为比较哈希代码来推断“它们是同一个对象”的另一点;由于我们在这里讨论的是引用类型(对于值类型来说,singleton是无意义的),检查两个引用是否指向同一个对象的最佳方法是:
这不依赖于
|
![]() |
3
5
clr提供的一个保证是,即使类由多个线程使用,它也能正常工作。这在ECMA 335第二部分第10.5.3.3节中有规定: 在多线程系统中进行类型初始化时,也存在类似但更复杂的问题。例如,在这些情况下,两个单独的线程可能开始尝试访问 类型(A和B),然后每个类型都必须等待另一个类型完成初始化。
确保上述第1点和第2点的算法的大致轮廓如下:
很明显,这是他们为clr实现建议的算法,而不是您的代码。 |
![]() |
4
3
其他答案也评论了岩石的安全性。以下是关于哈希代码的更多参考:
哈希代码相同意味着这两个对象
可以
被考虑
“平等”
-不同于“相同”的概念。所有的哈希代码都告诉你,如果两个对象
不同的哈希代码
他们是
一定地
不
“平等”
-因此,含蓄地说,绝对不是“相同的”。平等的定义是
|
![]() |
5
1
它是静态的,意味着它属于类,并且是只读的,所以在初始化之后不能更改我,所以是的,您将得到相同的对象。 |
![]() |
6
0
在这种情况下,它工作得很好,但是如果您用[threadstatic]属性标记实例,那么内联初始化将无法工作,您将不得不使用其他东西,例如惰性初始化,在这种情况下,您不必担心使用singleton的操作是否是“线程安全的”,因为singleton是每个线程的。 当做。。。 |
![]() |
7
0
您可能会对初始化的惰性感兴趣 可能会有所不同。 如果您关心何时 实例实际上已初始化。 为了避免以错误的方式曝光,我向您提供了有关他的链接 关于单例模式的文章。 您的问题涉及到本文中讨论的第四个(并建议)单例模式实现。 Singleton: singleton implementation 在本文中,您可以找到一个链接,指向有关beforefieldinit和初始化的惰性的讨论。 |
![]() |
8
-2
您认为它们是相同的,因为散列码是相同的,这是不正确的,
假设你没有超载
这将输出
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 5 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 5 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 5 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |