non*_*tor 5 java thread-safety
我看到这个初始化实例变量的习惯很多
public class Test{
private Long l = 1l;
private MyClass mc = new MyClass();
public Test(){}
...
}
Run Code Online (Sandbox Code Playgroud)
但我更愿意
public class Test{
private Long l;
private MyClass mc;
public Test(){
l = 1l;
mc = new MyClass();
}
...
}
Run Code Online (Sandbox Code Playgroud)
考虑到这些是非最终变量,在线程安全方面,2种方法是等效的还是比另一种更"正确"?
线程安全不是问题,因为这在构造阶段发生,并且两个线程不能构造相同的对象.好吧,如果你让它this从构造函数中逃脱,那么另一个线程可能在构造期间访问该对象,但你真的不应该这样做.功能方面,两个选项是相同的,所以即使存在线程安全问题,它们也会以同样的方式影响.
如果你需要做一些无法在初始化程序中完成的计算,那么第一个选项是初始化声明中的字段并不总是可能的(即便如此,如果你在初始化程序中执行它,你可以保持初始化的结构.虽然阻止.但是,如果任何一种方式都可行,那么它纯粹是一种风格问题,而且我认为Java程序员并不存在明显的偏好,所以请选择对你来说更好的方式.