5

我有以下情况:我在这里展示的代码很简单,以澄清我的担忧:

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 的良好替代品吗?如果否,那么为什么?

4

1 回答 1

8

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

使用数组也不是一个好主意,尽管从技术上讲它运行良好。问题是生成的代码描述性不太强,因为从 API 本身看不到索引与其含义(即0-> 奇数、 -> 偶数)的“映射”。1

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

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

这实现了非常好的可读性,而不会造成在幕后发生并发事件的错误印象。

于 2014-04-21T16:38:28.003 回答