【发布时间】:2013-01-16 09:06:20
【问题描述】:
基本上以下方法有效,但由于我阅读了 final 关键字,我不确定如果不同线程访问它是否必须声明 name final?
提前致谢。
public class Test4 {
// to ensure thread-safety do we have to declare the variable name final ?
private String name;
public Test4 (String name) {
this.name = name;
}
public void start() {
new MyThread().start();
}
private class MyThread extends Thread {
public void run() {
System.out.println(name);
}
}
public static void main(String[] args) {
Test4 t = new Test4("Don't know if I am threadsafe");
t.start();
}
}
【问题讨论】:
-
这将始终打印“不知道我是否是线程安全的”,无论最终结果如何。直到对象被构造出来,new() 才会返回;这将在新线程启动之前发生。
-
@pst 在进一步写入
name的情况下,是的,存在差异。然而,如果name的唯一写入时间是在构造期间,则永远不需要final(尽管它确实使读者的意图更清楚)。
标签: java multithreading thread-safety