2010-07-23 58 views
0

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

在下面的代码中,变量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; 
    } 
} 
} 

但我发现了

+0

这个问题并不完整,如果我们能看到整个班级,我们可以提供更好的答案。 – nanda 2010-07-23 09:43:39

回答

0

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

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

+0

是的,尝试了相同的AtomicInteger,它工作。谢谢您的帮助 :) – Raghav 2010-07-23 09:56:10

1

我认为,如果你愿意,你可以再补充挥发到您的柜台

+0

只适用于java> = 1.5,仍为+1 – atamanroman 2010-07-23 10:08:03

+0

yup,但AtomicInteger在这种情况下是过度杀毒,并且在Java <1.5时,您还没有AtomicInteger:P – nanda 2010-07-23 10:13:28

+0

我认为你错了.. volatile只能用于如果写入的值不依赖于当前值!否则,这种解决方案可能会导致“丢失更新问题”(请参阅​​http://www.javamex.com/tutorials/synchronization_volatile_when.shtml) – Javaguru 2010-07-23 11:12:14

1

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

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

你可能想使你的计数器值是易失性,或AtomicInt - 它不是在Java的保证多个线程会立即看到更新的变量。