我正在尝试在几个线程之间同步 int 计数器 (6)。下面是我的 worker 类(Class)。我正在尝试同步我的私有(private)领域 countertest
:
public class DbWorker implements Callable {
private final Object lock = new Object();
private int countertest = 0 ;
private boolean IsActive(Integer act)
{
synchronized(lock){
boolean exists = false;
countertest++;
....
System.out.println("countertest IS : " + countertest );
}
return true;
}
public void run() {
....
IsActive(act):
...
}
}
在我的主类中,我使用 for 循环和 ExecutorService 创建线程。请看下面:
private ExecutorCompletionService<Integer> _objQueue ;
for(int j = 0; j < 6; j++){
_objQueue.submit( new DbWorker( "SOME PARAMETER" , _snapshots.get(j) , j ) );
}
我的反测试变量未同步,它正在打印不同的数字(非连续)。我做错了什么?
最佳答案
你的锁
private final Object lock = new Object();
是一个实例字段。换句话说,每个 DbWorker
对象都有一个。
然后,您提交 DbWorker
实例以供执行
_objQueue.submit( new DbWorker( "SOME PARAMETER" , _snapshots.get(j) , j ) );
每个线程都有自己的DbWorker
,因此也有自己的锁。线程永远不会与任何其他线程竞争。
创建一个DbWorker
并在线程之间共享它,即。每次提交
相同的DbWorker
实例。
关于Java在Executor Service池中的线程之间同步数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33160803/