Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这些线程在哪个对象上同步_Java_Multithreading_Monitor_Synchronized - Fatal编程技术网

Java 这些线程在哪个对象上同步

Java 这些线程在哪个对象上同步,java,multithreading,monitor,synchronized,Java,Multithreading,Monitor,Synchronized,我想同步通过ExecutorService调用的3个线程。如何确保它们在同一对象上同步 现在我有这个代码: class Test { executor.submit(new Request(threadNames[i])); executor.submit(new Request(threadNames[i])); executor.submit(new Request(threadNames[i])); private class Request impl

我想同步通过ExecutorService调用的3个线程。如何确保它们在同一对象上同步

现在我有这个代码:

class Test { 
    executor.submit(new Request(threadNames[i]));
    executor.submit(new Request(threadNames[i]));
    executor.submit(new Request(threadNames[i])); 

    private class Request implements Callable {
        @Override
        public Long call() throws InterruptedException {
            if (threadName.equals("SOMETHING") {
                doSomething();
            } else {
                doSomeOtherThing();
            }
        }
    }

    private synchronized void doSomething() {
    }

    private synchronized void doSomeOtherThing() {
    }

    ...
}
其中一个线程负责生成一个条件,另两个线程对其进行操作

  • 您不能向Executor服务提交线程;您提交任务,这些任务稍后将在执行器线程池中的一个线程上执行

  • 如果一个任务是生产者,另两个是消费者,那么将所有三个任务提交给执行者是错误的。它很容易导致死锁,使用者任务无限期地等待生产者,但生产者无法运行,因为使用者占用了所有线程

  • 重新考虑您的解决方案,使生产者任务也负责将消费者任务提交给执行者;任务可以用生成的值实例化,因此协调问题从一开始就得到解决。

    根据文档():

    每个对象都有一个与之关联的内在锁。按照惯例, 一个线程,需要对对象的 字段在访问之前必须获取对象的固有锁 然后在处理完它们后释放内部锁。A. 线程被称为拥有它拥有的时间之间的内在锁 获取锁并释放锁

    当线程调用同步方法时,它会自动获取 该方法对象的内部锁,并在 方法返回。即使导致返回,也会释放锁 一个意外的例外

    您可能想知道当使用静态同步方法时会发生什么 调用,因为静态方法与类关联,而不是 对象在这种情况下,线程获取 与该类关联的类对象。这样就可以访问类的静态 字段由一个锁控制,该锁不同于任何字段的锁 类的实例


    因此,您的方法正在使用来自
    Test
    对象的内在锁,是的,正如Marko正确指出的那样,您可能会遇到死锁。

    用于同步
    doSomething
    doSomeOtherThing
    的锁将位于创建
    请求的
    Test
    实例上。很难准确地说出发生了什么,因为您的代码不完整,并且不能以当前形式工作。
    executor
    调用在
    Test
    classis中显示的位置没有意义。我知道我们将任务提交给executor服务。这是我的问题陈述:我想生成由2个测试线程调用的API调用的所有可能交错。为了实现这一点,我想为每个请求分配一个线程,其中一个请求由许多API调用组成。我希望线程在调用每个方法后暂停,我希望另一个线程,比如调度器根据简单的排列发送信号/决定哪个测试线程应该继续。我目前正在与同步方法和wait()和notify()同步当所有3个线程都提交给executor服务时,我显然陷入了死锁。您是否意识到,这些棘手的并发问题不是来自交错,而是来自写可见性问题?如果您只想测试API调用的交错,使用任何此类交错进行简单的顺序执行就足够了。否则,为了真正测试线程安全性,任何类型的同步都是不可能的,因为它引入了在正常情况下不存在的关系之前发生的同步,从而掩盖了数据竞争问题。