|
|
1
2
除非你特别想在Java并发问题上不同意Brian Goetz的观点,否则我会认为这是错误的。尽管他的确切说法是“最好不要……”,但我还是会听从他的建议。从 JCIP,第42页:
更新: 只是想详细说明为什么这是一个问题。虽然在对thread.start()的调用和该线程实际开始执行的run()方法之间有一个内存屏障,但是在构造函数期间发生的事情之间没有这样的屏障。 之后 对thread.start()的调用。因此,如果还需要设置一些其他变量,或者如果JVM执行了一些“刚刚构造的对象”内务管理,那么这两个变量都不能保证被另一个线程看到:也就是说,另一个线程在不完整的状态下可以看到该对象。 顺便说一句,除了它是否真的破坏了JMM之外,它还感觉有点像构造函数中的“奇怪的事情”。 |
|
|
2
3
和
因此,我们可以得出这样的结论:在调用thread.start()之前,构造函数中的所有操作都发生在启动线程中的所有操作之前。如果thread.start()在所有写入对象字段之后,则已启动的线程将看到所有写入对象字段的操作。如果对字段没有其他写入操作(其他线程将读取),则代码是线程安全的。 |
|
3
-3
|
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |