使用AtomicInteger作为可变整数的替代是一种好习惯吗?

时间:2014-04-21 16:31:37

标签: java mutable atomicinteger

我有以下几种情况: 我在这里展示的是一种简单的代码形式,以澄清我的担忧:

public void callMe()
{
 AtomicInteger howManyOdds = new AtomicInteger(0);
 AtomicInteger howManyEvens = new AtomicInteger(0);
 loopThrough(100,howManyOdds,howManyEvens);
 System.out.println(howManyOdds.get()+" "+howManyEvens.get());
}
private void loopThrough(int counter,AtomicInteger howManyOdds,AtomicInteger howManyEvens)
{
 for(int i = 1 ; i <= counter ;i++)
 {
  if(i%2 == 0)
  howManyEvens.getAndAdd(1);
  else
  howManyOdds.getAndAdd(1);
 }
}

我知道可以通过int[]来完成,但它看起来很奇怪。在这种情况下,AtomicInteger是Mutable Integer的良好替代品吗? 如果否则为什么?

1 个答案:

答案 0 :(得分:7)

我认为这不是一个好主意:在非本地并发的上下文中使用AtomicInteger会误导读者。

使用数组也不是一个好主意,尽管从技术上来说它运作良好。问题是结果代码不是太具描述性,因为&#34;映射&#34;索引的含义(即0 - &gt; odd,1 - &gt; even)在API本身中不可见。

使用包含两个属性的可变类会更好:

public class OddEven {
    int odd, even;
    public int getOdd() {return odd;}
    public int getEven() {return even;}
    public void incOdd() {odd++;}
    public void incEven() {even++;}
}

这实现了非常好的可读性,而不会产生错误的印象,即在场景后面会发生并发事件。