我已经读过 Java String 类是不可变的且线程安全的,但我仍然对 Strings 的引用分配是否是线程安全的感到困惑。
第一个问题:如果线程A调用Foo.setString()
,而线程B调用Foo.getString()
,则以下代码线程-安全的?
Class Foo {
String aString;
public String getString() {
return aString;
}
public void setString(s) {
aString = s;
}
}
第二个问题:如果上面的代码不是线程安全的,使用ReentrantLock,我该如何编写Foo.getString()
方法?
Class Foo {
String aString;
ReentrantLock aLock;
public String getString() {
aLock.lock();
return aString;
aLock.unlock(); // This line will be unreachable. How to fix??
}
public void setString(s) {
aLock.lock();
aString = s;
aLock.unlock();
}
}
我必须使用 ReentrantLock,因为我需要使用 tryLock(timeout) 功能。
最佳答案
问题1: 这取决于你所说的线程安全是什么意思,Eric Lippert wrote a very good blog post about it here ... 但是将 aString 声明为 volatile 将意味着不同线程上的任何读取都保证是正确的。
问题2:
使用 try...finally 构造,在 finally block 中解锁,例如:
public String getString() {
try {
aLock.lock();
return aString;
} finally {
aLock.unlock();
}
}
public void setString(s) {
try {
aLock.lock();
aString = s;
} finally {
aLock.unlock();
}
}
关于java - 如何安全地设置/获取Java中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8113496/