JMM (Java内存模型)可以自由地重新排序语句。
当然,这在处理多线程环境时特别棘手。
JMM规则规定,volatile和final变量总是在构造函数完成之前完全初始化,并且只有当引用没有从构造函数中“转义”时才能完成。
这意味着“正常”变量(非final和非volatile)不会被任何并发线程看到。
乍一看,我的问题似乎很愚蠢,但实际上并非如此:
在构造函数完成后,是否有任何对象的引用设置为(完成时已经完成了所有变量的初始化,而是简单地到达了‘构造函数’过程的末尾)?在任何JSR中是否有断言它的规则?或者是否存在一种特殊情况,即在客户端构造函数完成之前可以将任何引用发送回客户端?
事实上,如果语句重新排序被认为是如此自由,也可能意味着在构造函数完成之前发送对象的引用“发生”。因此,我们会遇到同样的情况"this转义“来避免。
简单地说,引用总是在构造函数完成后发送吗?
在搜索JLS:之后,对象引用返回的唯一地方是:(JSR-12.5摘录)
在作为结果返回对新创建对象的引用之前,将使用以下过程处理指示的构造函数以初始化新对象:
与JMM无关..。因此,可以确保构造函数完成总是发生-在传递引用之前,不管是什么情况。
发布于 2012-10-22 01:58:21
在线程的上下文中,将设置引用。但是,JMM允许在一个线程中设置共享变量,而不是与另一个线程同步。
易失性和最终性通过保证线程间对变量的读和写同步来保证这一点。
https://stackoverflow.com/questions/13003924
复制相似问题