2

私は実行中の並行性を読んでいて、いくつか質問がありました。

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) を呼び出した場合、その最後のストゥーグはゲッターに表示されますか?

4

3 に答える 3