根据维基百科,线程安全代码保证没有竞争条件,并且在通过互联网之后,似乎不可变对象本身就是线程安全的,并且不需要任何额外的同步。但是,我无法理解这是怎么可能的。 例如,假设我有一个不可变类Counter。
public class Counter{
private final int counter;
public Counter(int counter){
this.counter = counter;
}
public int getCounter(){ return counter;}
public Counter incrementCounter(){
return new Counter(counter+1);
}
}
现在假设我创建一个值为0的计数器对象。两个线程同时访问值为0的对象,递增它并以两个不同的计数器对象结束,两者都为值1.但是这不会导致竞争条件??通过使用synchronized块,我将得到一个计数器值为2的单个对象,但不使用Immutable对象。尽管不可变对象对于读取是线程安全的,但是在写入时它们是否需要外部同步?
答案 0 :(得分:2)
如果线程“只是”增加计数器并为自己保留对象,则没有问题。问题是如果线程想要将新对象存储在旧的0计数器所在的位置(并且此变量不是不可变的)