Inq*_*ive 18 java multithreading synchronization thread-safety java-memory-model
Bha*_*kar 27
初始化安全性允许外部线程在其完全构造(初始化)状态下看到对象.前提条件是不应过早发布对象,即.在它的构造函数中.一旦确保这一点,JMM就要求声明为的字段具有某些行为final.首先,所有final对象字段都被保证在外部线程处于完全初始化状态时被看到 - 这并不像听起来那么简单 -
考虑一堂课
class A{
List list ;
A() {
list = Arrays.asList(some init expressions that adds 10 elements to list);
}
}
Run Code Online (Sandbox Code Playgroud)
访问该线程list的A的情况下是默认情况下不保证看到该列表中的10个元素.事实上,这个线程甚至可以list看作null.但是,如果list声明了final,那么,根据JMM的要求,list必须始终使用10个元素初始化它.
其次,这种初始化保证不仅限于final字段本身,而是递归地扩展到它所引用的所有对象.例如,如果list上面的例子中是lists本身的列表,那么外部线程保证看到内部列表完全初始化.
请注意,我们无处可synchronized用于在内存可见性方面实现此安全性(在关系之前发生).
| 归档时间: |
|
| 查看次数: |
2049 次 |
| 最近记录: |