Java Stringクラスは不変でスレッドセーフであることを読みましたが、Stringsの参照割り当てがスレッドセーフであるかどうかについてはまだ混乱しています。
最初の質問:Foo.setString()
スレッドBが呼び出している間にスレッドAが呼び出した場合Foo.getString()
、次のコードはスレッドセーフですか?
Class Foo {
String aString;
public String getString() {
return aString;
}
public void setString(s) {
aString = s;
}
}
2番目の質問: 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();
}
}
tryLock(timeout)機能を使用する必要があるため、ReentrantLockを使用する必要があります。