如何使用不可变对象保证线程安全

时间:2013-12-31 10:47:13

标签: thread-safety immutability

根据维基百科,线程安全代码保证没有竞争条件,并且在通过互联网之后,似乎不可变对象本身就是线程安全的,并且不需要任何额外的同步。但是,我无法理解这是怎么可能的。 例如,假设我有一个不可变类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对象。尽管不可变对象对于读取是线程安全的,但是在写入时它们是否需要外部同步?

1 个答案:

答案 0 :(得分:2)

如果线程“只是”增加计数器并为自己保留对象,则没有问题。问题是如果线程想要将新对象存储在旧的0计数器所在的位置(并且此变量不是不可变的)