我有一个要求,应该为每个被调用的线程分配一个计数器变量。但我没有得到预期的结果,实际上计数器在线程中重复。我创建了一个虚拟表和一个proc来将计数器值插入表中。无论如何,代码可以被更改,以便线程获得递增的值。
在下面的代码中,变量counter
是static 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;
}
}
}
但我找到了
答案 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)
如果你想:
编辑: 看过你的代码之后,它就是所有线程的一个计数器,所以你可以使用AtomicInteger进行所有并且没有必要同步,因为AtomicInteger是一个多线程对象。
答案 3 :(得分:0)
您可能希望将计数器值设置为volatile或AtomicInt - 在Java中无法保证多个线程会立即看到变量更新。