gpt4 book ai didi

Java保证不可变对象(immutable对象)的初始化安全?

转载 作者:搜寻专家 更新时间:2023-11-01 01:43:45 25 4
gpt4 key购买 nike

为了证明不可变对象(immutable对象)的初始化安全性,我编写了一个小程序。即使字段是最终的,第二个线程也能够查看第一个线程创建的半构建对象。我的概念有误还是“对象转义”会导致它?第二个线程首先打印“10 null”,然后在迭代一半后开始打印“10 apple”。

package test;

import java.util.ArrayList;
import java.util.List;

public final class ObjectEscape implements Runnable {

private final int a;
private final String b;

//this list is defined somewhere else
public static volatile List<ObjectEscape> globalList = new ArrayList<ObjectEscape>();

public ObjectEscape () throws InterruptedException {

a = 10;
globalList.add(this);
Thread.sleep(10);
b = "apple";
System.out.println("done");

}

public ObjectEscape(int a) {
this.a = 1;
b = "";
}

public static void main(String are[]) throws InterruptedException{

Thread t = new Thread(new ObjectEscape(1));
t.start();
ObjectEscape oe1 = new ObjectEscape();


}


@Override
public void run() {
int i=0;
while(i<10) {
if(globalList.get(0) != null)
System.out.println(globalList.get(0).a+" "+globalList.get(0).b);
i++;
}
}
}

最佳答案

final 字段保证在构造函数调用完成时初始化。自然地,一次“泄密”会颠覆这种保证的值(value):

globalList.add(this); // ObjectEscape.<init> has not finished yet

另请参阅:Java leaking this in constructor

关于Java保证不可变对象(immutable对象)的初始化安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18948170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com