当前位置: 首页 > 知识库问答 >
问题:

Java同步Executor Service池中线程之间的数据[重复]

王兴庆
2023-03-14

我正在尝试在几个线程(6)之间同步一个int计数器。下面是我的工人班。我正在尝试同步我的私有字段计数器测试

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 循环和执行器服务创建线程。请参阅以下内容:

private ExecutorCompletionService<Integer> _objQueue ;

 for(int j = 0; j < 6; j++){
     _objQueue.submit( new DbWorker( "SOME PARAMETER" , _snapshots.get(j) , j )    );
}

我的反测试变量不同步,它打印不同的数字(非顺序)。我做错了什么?

共有2个答案

陈法
2023-03-14

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

>

  • 反测试在这种情况下始终为1,实例之间不共享

    多个线程没有获得同一个锁,所以这是没有用的。

  • 孙子民
    2023-03-14

    你的锁

    private final Object lock = new Object();
    

    是实例字段。换句话说,每个< code>DbWorker对象都有一个。

    然后将DbWorker实例提交给执行

    _objQueue.submit( new DbWorker( "SOME PARAMETER" , _snapshots.get(j) , j )    );
    

    每个线程都有自己的< code>DbWorker,因此也有自己的锁。线程从不与任何其他线程竞争。

    创建一个数据库工作线程并在线程之间共享它,即。每次都提交相同的数据库工作实例。

     类似资料:
    • 问题内容: 假设我有一个利用该框架的应用程序 当我在调试器中运行此应用程序时,将使用以下(默认)名称创建一个线程:。如你所见,这并不是非常有用,而且据我所知,该框架没有提供一种简便的方法来命名已创建的线程或线程池。 那么,如何为线程/线程池提供名称呢?例如,。 问题答案: 你可以提供一个到。工厂将负责创建线程,并将能够为其命名。 引用Javadoc: 创建新线程 使用创建新线程。如果没有另外指定,

    • 这是我在这里的第一篇文章,提前感谢您的宽容。 我有一个带有作业队列的线程池 工艺流程: 初始化线程池(M 个线程数) 将 N 个任务放入队列中(N 个可以是 问题是同步点。我使用计数器和互斥锁实现了一个简单的信号量:在步骤2之前,计数器用要加载的任务数初始化,当每个任务完成时,计数器递减。如果counter==0,则我从工作线程发送pthread_cond_signal,步骤4中的pthrea德_

    • 在多线程实时系统中,一项工作的完成往往可以通过多个线程协调的方式共同来完成,那么多个线程之间如何 “默契” 协作才能使这项工作无差错执行?下面举个例子说明。 例如一项工作中的两个线程:一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递: 如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它,这将引起数

    • 本文向大家介绍java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例,包括了java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例的使用技巧和注意事项,需要的朋友参考一下 1、CountDownLatch: 一个同步工具类,它允许一个或多个线程一直等待,直到其他线

    • 每个人我对使用线程池有一个误解。实际结果与该类的API描述不同。当我在线程池中使用时,它不重用线程,线程池等待构造函数中设置的KeepAliveTime,然后杀死这个线程并创建一个新线程。当我将KeepAliveTime设置为较小值时,比如1秒或更短,它会删除一个线程并重新创建它,但如果我设置一分钟,则不会创建新线程,因为不允许创建,队列已经满,所以所有任务都会被拒绝,但KeepAliveTime

    • 本文向大家介绍在spring boot中使用java线程池ExecutorService的讲解,包括了在spring boot中使用java线程池ExecutorService的讲解的使用技巧和注意事项,需要的朋友参考一下 1. 认识java线程池 1.1 在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.需处理的任务的数量大 1.2 使用线程池的好处: 1.减少在创建和销毁线程上所花的