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

Mac*_*Mac 3 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);
 }
}
Run Code Online (Sandbox Code Playgroud)

我知道它可以通过int[]但它看起来有点奇怪.在这种情况下,AtomicInteger是Mutable Integer的良好替代品吗?如果不是那么为什么?

das*_*ght 7

我认为这不是一个好主意:AtomicInteger在不具有内在并发性的上下文中使用会误导读者.

使用数组也不是一个好主意,即使从技术上来说它运作良好.问题在于,结果代码不是太具描述性,因为索引与其含义的"映射"(即0- >奇数,1- >偶数)在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++;}
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Mac这不是一个值得关注的性能:使用`AtomicInteger`的代码将达到或几乎同样高效.主要问题是将您的想法传达给人类读者.他们为什么要挠头思考:"为什么他要我通过`AtomicInteger`?我不认为他的班级是并发的;我错了吗?" 一般而言,您希望避免此类事件,因为这会使其他人难以维护您的代码. (2认同)
  • @Mac是的,即使那样,我仍然认为这是一个坏习惯。在某个时候,您想继续前进,并将您编写的代码提供给其他人进行维护。您不想永远维护该代码,对吗?即使您对此感到满意,您的公司也会有一些疑问(即臭名昭著的“撞车”问题)。 (2认同)