Java在Executor Service池

时间:2015-10-16 00:45:27

标签: java multithreading

我试图在几个线程之间同步一个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变量未同步它正在打印不同的数字(非顺序)。我做错了什么?

2 个答案:

答案 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)

因为您在循环中创建了一个实例,其中countertestlock是实例变量,因此每个对象都会获得一个新实例。

    在这种情况下,
  1. countertest将始终为1,实例之间不会共享

  2. 多个线程没有获取相同的锁,因此没用。