Java Reg:线程中的计数器变量

Java Reg:线程中的计数器变量,java,Java,我有一个要求,应该为每个被调用的线程分配一个计数器变量。但是我没有得到预期的结果,实际上计数器在线程中重复。我创建了一个虚拟表和一个将计数器值插入表的过程。无论如何,是否可以更改代码以使线程获得递增的值 在下面的代码中,变量计数器是一个静态整数 public synchronized int testSequence(){ System.out.println("testSequence::::: "+counter++); //Random rn = new Random(); Call

我有一个要求,应该为每个被调用的线程分配一个计数器变量。但是我没有得到预期的结果,实际上计数器在线程中重复。我创建了一个虚拟表和一个将计数器值插入表的过程。无论如何,是否可以更改代码以使线程获得递增的值

在下面的代码中,变量
计数器
是一个
静态整数

public synchronized int testSequence(){
 System.out.println("testSequence::::: "+counter++);
 //Random rn = new Random();
 CallableStatement cstmt;
 {
  try {
   cstmt = conn.prepareCall("{call insertjtest(?)}");
   cstmt.setInt(1,counter);
   //cstmt.setInt(1, rn.nextInt());
   cstmt.execute();
   cstmt.close();
   conn.commit();
   return counter;
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   return 0;
  }
 }
}

但是我发现

我认为你可以在你的计数器中添加volatile,如果你想:

  • 对于每个线程,您可以为每个线程对象使用变量或实例变量
  • 所有线程的计数器,可以使用变量
编辑:
看过代码后,它是所有线程的一个计数器,因此您可以对所有线程使用AtomicInteger,而不必进行同步,因为AtomicInteger是一个多线程对象。

如果我正确理解了您的问题,您希望在每次调用线程时增加变量
计数器
(或其运行方法)。 因此,您可以尝试以下方法:

Thread myThread = new Thread(myRunnable) {
  private int myValue;
  public void run() {
    // Call your "routine" ..
    myValue = XXX.testSequence();
    super.run();
  }
};

您可能希望将计数器值设置为volatile或AtomicInt-在Java中不保证多个线程会立即看到变量的更新。

问题还不完整,如果我们可以看到整个类,我们可以提供更好的答案。是的,尝试了相同的AtomicInteger,结果成功。感谢帮助:)是的,但是AtomicInteger在这种情况下是多余的,在Java<1.5上,你也没有AtomicInteger:我认为你错了。。仅当要写入的值不依赖于当前值时,才能使用volatile!否则,此解决方案可能会导致“丢失更新问题”。。(请参阅)是的,但问题不会出现,因为方法是同步的(当然,如果在任何其他方法中修改了计数器,我们不知道,因为代码不完整,我怀疑,因为这意味着代码存在更大的问题)。在模式#5:廉价的读写锁技巧上可以看到这一点。。但是如果您已经在使用synchronized,那么volatile有什么好处呢?在同步块/方法中使用volatile没有任何好处…@Javaguru问题在于没有volatile字段的值可以由JVM缓存