【发布时间】:2013-11-14 04:12:49
【问题描述】:
我一直在阅读并发操作,并有几个问题。
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 上可见吗?
【问题讨论】:
标签: java multithreading thread-safety