小智 10

不可变对象String是线程安全的,因为它们的内部状态永远不会改变,final对这些String对象的引用是线程安全的.

但是,如果您对不可变对象有非最终引用,则它不是完全线程安全的.

鉴于:

public final String x = "This reference is thread safe, it can never change";
Run Code Online (Sandbox Code Playgroud)

任何引用x都是线程安全的,因为x引用的内容永远不会改变且String对象是不可变的.

并给出:

public String s = "This reference is not thread safe, it can change";
Run Code Online (Sandbox Code Playgroud)

任何引用s不是线程安全的,因为s都不可能改变到别的东西.那是 :

s = "this is another different immutable String";
Run Code Online (Sandbox Code Playgroud)

可以改变所指的东西s.如果您的引用永远不会更改,final如果需要更改它们volatile,则应声明它们,以便JVM知道重新读取引用的内容,而不执行任何可能错过更改的缓存验证s.

public volatile String s = "This reference is expected to change, so tell the JVM";
Run Code Online (Sandbox Code Playgroud)

有关线程安全性和关键字的更多信息,请参阅最后的最后一个单词final.


Rev*_*nzo 5

不,字符串是不可变的.如果您所做的只是读取字符串,那么您绝对没问题.

编辑添加:是,如果您有可变属性,则需要同步更改属性的值.

  • 这并不完全准确,对`String`的引用也必须是'final`以使其完全线程安全. (2认同)