我一直在阅读并发操作并且有几个问题。
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);
}
}
这本书说,因为这个类是不可变的,所以它是线程安全的,因为没有修改状态(stooges)。我很困惑的是这个。如果多个线程同时调用 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()
.
感谢你们
更新
假设 stooges 类更改为以下...
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),那么最终的 stoog 在 getter 上是否可见?