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缓存