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