从ExecutorService调用同步方法无法正常工作

时间:2018-09-27 13:10:03

标签: java spring rest elasticsearch synchronized

我有一个REST API,其中包含一些同步任务,这些错误使我出错。我会尽力解释这个想法。

假设我的Controller类中有以下代码:

@Qualifier("serviceA")
@Autowired
private UpdateService updateServiceA; // connected to host A

@Qualifier("serviceB")
@Autowired
private UpdateService updateServiceB; // connected to host B

@Autowired
private ExecutorService myExecutorService;

// one of my endpoints calls update method below

public void update(Object x) {
   myExecutorService.submit(() -> {
      updateServiceA.remove(x); // remove x on host A
      updateServiceB.remove(x); // remove x on host B
   }
}

UpdateServiceImpl类中,我有以下内容:

public class UpdateServiceImpl implements UpdateService {

   public synchronized void remove(Object x) {
     // 1. find x
     // 2. if x exists, remove it
     // Response response = elasticSearch.performRequest(...)
   }

}

然后在配置类中对bean进行如下配置:

@Bean
public ExecutorService executorService() {
    return Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
}

@Qualifier("serviceA")
@Bean
public UpdateService getUpdateService() {
    return new UpdateServiceImpl();
}

@Qualifier("serviceB")
@Bean
public UpdateService getUpdateService() {
    return new UpdateServiceImpl();
}

后端是ElasticSearch。删除方法只是执行删除操作。

我偶尔会在日志中看到找到了一个条目,但是当它试图删除它时,该条目不再存在。我感到与此同时,另一个线程(?)已经删除了该对象。我不明白为什么synchronized方法不能正常工作。

我在这里错过了什么吗?

0 个答案:

没有答案