Java在Executor Service池中的线程之间同步数据

标签 java multithreading

我正在尝试在几个线程之间同步 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/

相关文章:

java - 如何检查一个数组是否具有另一个数组的平方元素(无论顺序如何)?

java - Android异步操作实现

java - 如何设计以避免在初始化字段时主线程异常上的数据库访问?

c - 通过控制台设置线程数时Openmp段错误

java - 以编程方式重构参数名称

java - 在 web.xml 中添加条件

java - 使用 jQuery 将参数发送到 Java Server Pages (JSP)

java - 如何让多个线程绘制到 AWT 组件上?

c++ - 在多线程环境中使用 libcurl 会导致与 DNS 查找相关的性能非常慢

c++ - 优雅断言函数不是从多个线程调用的