我读过 Java String 类是不可变的和线程安全的,但我仍然对字符串的引用分配是否是线程安全的感到困惑。
第一个问题:如果线程 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) 功能。