我试图在几个线程之间同步一个int计数器(6)。以下是我的工人班。我正在尝试同步我的私人字段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 ) );
}
我的countertest变量未同步它正在打印不同的数字(非顺序)。我做错了什么?
答案 0 :(得分:3)
你的锁
private final Object lock = new Object();
是一个实例字段。换句话说,每DbWorker
个对象就有一个。
然后提交DbWorker
个实例以供执行
_objQueue.submit( new DbWorker( "SOME PARAMETER" , _snapshots.get(j) , j ) );
每个线程都有自己的DbWorker
,因此它有自己的锁。线程永远不会与任何其他线程竞争。
创建一个DbWorker
并在线程之间共享,即。 submit
每次DbWorker
个实例。
答案 1 :(得分:2)
因为您在循环中创建了一个实例,其中countertest
和lock
是实例变量,因此每个对象都会获得一个新实例。
countertest
将始终为1,实例之间不会共享
多个线程没有获取相同的锁,因此没用。