基本上,下面的代码可以工作,但是因为我读到了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();
}
}发布于 2013-01-16 17:09:44
最后的变量是immutable,一旦构造就不能改变它的值,所以它不会有并发问题。
发布于 2013-01-16 17:11:06
如果没有final,您将无法获得该字段的正确值。
也许在你改变了字段的值之后,线程得到了旧值。
检查JMM的Visibility。
Another link of volatile。
Happends-Before Rule。
Happends-Before in JMM。
发布于 2013-01-16 17:23:18
你可能在找一个AtomicReference或者volatile吗?这取决于你所说的线程安全。
// Atomic to allow deeper control of updates.
private AtomicReference<String> name = new AtomicReference<String>();
// Volatile to ensure it is not cached.
private volatile String vName;
public Test(String name) {
this.name.set(name);
this.vName = name;
}
public void start() {
new MyThread().start();
}
private class MyThread extends Thread {
public void run() {
System.out.println(name.get());
System.out.println(vName);
}
}https://stackoverflow.com/questions/14354620
复制相似问题