Reg:螺纹中的计数器变量

时间:2010-07-23 09:19:42

标签: java

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

在下面的代码中,变量counterstatic int

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;
  }
 }
}

但我找到了

4 个答案:

答案 0 :(得分:1)

我认为你可以将易失性添加到你的柜台

答案 1 :(得分:1)

如果我正确理解了您的问题,您希望在每次调用线程(或其run-method)时增加变量counter。 因此,你可以尝试类似的东西:

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

答案 2 :(得分:0)

如果你想:

  • 每个线程的独立couters,您可以为每个Thread对象使用ThreadLocal变量或实例变量
  • 所有主题的计数器,您可以使用AtomicInteger变量

编辑: 看过你的代码之后,它就是所有线程的一个计数器,所以你可以使用AtomicInteger进行所有并且没有必要同步,因为AtomicInteger是一个多线程对象。

答案 3 :(得分:0)

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