私は実行中の並行性を読んでいて、いくつか質問がありました。
public final class ThreeStooges {
private final Set<String> stooges = new HashSet<String>();
public ThreeStooges() {
stooges.add("Moe");
stooges.add("Larry");
stooges.add("Curly");
}
public boolean isStooge(String name) {
return stooges.contains(name);
}
}
この本は、このクラスは不変であるため、状態(手先)の変更がないため、スレッドセーフであると述べています。私が迷っているのはこれです。複数のスレッドが isStooge(String name) メソッドを同時に呼び出すとどうなるでしょうか。何が起こるのですか?
public class HolderObject{
private Holder holder;
public void initialize() {
holder = new Holder(42);
}
}
この本は、これはスレッドセーフではないと言っていますか? なんで?それが適切に公開されていないということはどういう意味ですか?
public class Holder {
private int n;
public Holder(int n) { this.n = n; }
public void assertSanity() {
if (n != n)
throw new AssertionError("This statement is false.");
}
}
これと同じこと。どうしたの?複数のスレッドがassertSanity()
.
君たちありがとう
アップデート
stoges クラスが次のように変更されたとしましょう...
public class ThreeStooges {
private List<String> stooges = new ArrayList<String>();
public ThreeStooges() {
stooges.add("Moe");
stooges.add("Larry");
stooges.add("Curly");
}
public synchronized void addStoog(String stoog){
stooges.add(stoog);
}
public boolean getStoog(int index){
return stooges.get(index);
}
public boolean isStooge(String name) {
return stooges.contains(name);
}
}
ここにスレッドの問題はありますか? ゲッターの可視性の問題? スレッド A が addStoog("Bobby") であり、スレッド B が getStoog(3) を呼び出した場合、その最後のストゥーグはゲッターに表示されますか?