2014-05-21 48 views
0

我正在从运行嵌套类的多个线程访问私有字符串字段。Java:String对象的线程安全

我知道String对象是不可变的,所以传递String作为参数应该总是安全的。但如何访问完全相同的领域?我认为它不是线程安全的?

回答

1

它仍然是线程安全的,因为您只能访问该字段。如果某个线程会尝试修改字段(其状态或更改整个对象引用),而其他线程同时获取此变量的值,则问题将会发生。

通常情况下,需要创建一个实现Runnable类,并通过必要的参数:

class MyTask implements Runnable { 
    private final String needThis; 
    public MyTask(String needThis) { 
     this.needThis = needThis; 
    } 
    @Override 
    public void run() { 
     //do your task using needThis variable here... 
    } 
} 

这可以适用于其他类型的参数,以及。此外,最好发送不可变类的对象引用(如String)作为线程的数据。

+0

好的,当然是。但我想以一种可能的未来调整不会破坏我的代码的方式进行编码:)。所以将String传递给Runnable的构造函数可能是更好的方法?! – user3541377

+0

@ user3541377是的。 –

+0

使用stringbuffer –

2

如果您只是在阅读领域,它始终是线程安全的。 使字段最终确定,以便编译器检查您是否正在更改值?

private final String theField = "TheValue" 
+0

另一个好方法,但在我的情况下,字符串是动态设置的,所以我会用另一种方式。 – user3541377