首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从内部类线程访问外部字段(非final)是否是线程安全的?

从内部类线程访问外部字段(非final)是否是线程安全的?
EN

Stack Overflow用户
提问于 2013-01-16 17:06:20
回答 5查看 877关注 0票数 3

基本上,下面的代码可以工作,但是因为我读到了final关键字,所以我不确定如果不同的线程访问它,我是否必须声明name final?

提前谢谢。

代码语言:javascript
复制
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();
    }

}
EN

回答 5

Stack Overflow用户

发布于 2013-01-16 17:09:44

最后的变量是immutable,一旦构造就不能改变它的值,所以它不会有并发问题。

票数 3
EN

Stack Overflow用户

发布于 2013-01-16 17:11:06

如果没有final,您将无法获得该字段的正确值。

也许在你改变了字段的值之后,线程得到了旧值。

检查JMM的Visibility

Another link of volatile

Happends-Before Rule

Happends-Before in JMM

票数 2
EN

Stack Overflow用户

发布于 2013-01-16 17:23:18

你可能在找一个AtomicReference或者volatile吗?这取决于你所说的线程安全。

代码语言:javascript
复制
// 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);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14354620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档