String get/set threadsafe?

mre*_*mre 8 java immutability thread-safety

假设我有以下内容,

public class Foo{
    private String bar;

    public String getBar(){
        return bar;
    }

    public void setBar(String bar){
        this.bar = bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

由于String类的不可变特性,这些方法是自动线程安全的,还是需要一些锁定机制?

Mat*_*all 19

不,这不是线程安全的.Foo是可变的,所以如果你想确保不同的线程看到相同的值bar- 即一致性 - 或者:

  • 制作bar volatile,或
  • 制作方法synchronized,或
  • 用一个AtomicReference<String>.

读取和写入bar本身就是原子的,但原子性不是线程安全的.

http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html


要深入了解Java并发性,请获取Java Concurrency in Practice(又名JCIP)的副本.

  • +1或简单地将`bar`声明为`final`,因此无法将引用重新分配给另一个值.当然,那时候没有二传手:) (4认同)

Bri*_*new 7

你正在设置参考文献,因此String不变性不起作用.你没有影响到的内容String.


duf*_*ymo 5

不,不安全.

这是Foo可变行为; 字符串的不变性不会归于Foo.

public class Foo{
    private String bar;

    public synchronized String getBar(){
        return bar;
    }

    public synchronized void setBar(String bar){
        this.bar = bar;
    }
}
Run Code Online (Sandbox Code Playgroud)