Java - 在 ConcurrentSkipListMap 上同步线程是否可以接受?

标签 java multithreading concurrentskiplistmap

我有一个程序,其中许多线程将其请求发送到 PriorityQueue 。 随后,他们等待 ConcurrentSkipListMap 的回复。 。有一个线程发布了 ConcurrentSkipListMap 的答案.

以下代码行说明了这一点:

在程序初始化时

PriorityQueue<Request> requests = new PriorityQueue<Request>();
ConcurrentSkipListMap<Long, Reponse> responsesReceived = new ConcurrentSkipListMap<Long, Reponse>();

在调用者线程中

// Send request ...
Request r = ... // Elaborate the request 
requests.add(r);

// ... then wait for an answer
Long id = r.getId();
while (responsesReceived.containsKey(id) == false) {
    synchronized (responsesReceived) {
         responsesReceived.wait();
    }
}

Answer a = responsesReceived.take(id);

// Do other things ...

在响应处理程序线程中

// Wait for a remote answer
Answer answer = ...;

// Once received publish it in ConcurrentSkipListMap
responsesReceived.put(answer.getRequestId(), answer);

synchronized (responsesReceived) {
    responsesReceived.notify();
}

// Go back and wait for a new answer...

问题

  • ConcurrentSkipListMap上同步调用者线程和响应处理程序线程是否安全? ?
  • 我应该使用锁进行同步吗?
  • 我应该使用 HashMap锁(HashMap<Long,Object>)?

我对 java.util.concurrent API 还很陌生,我有一些疑问......

最佳答案

通过synchronized/wait/notify,你可以使用任何对象作为锁。至于将作业提交到队列并等待其结果,请查看 ExcutorServiceFutureCompletionService

关于Java - 在 ConcurrentSkipListMap 上同步线程是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15678984/

相关文章:

ios - 未收到 NSNotification

.net - 多核使用、线程、线程池

java - ConcurrentSkipListMap.compute() 对于相关更新安全吗?

java - 如何删除要在 ConcurrentSkipListMap 中键入的元素?

java - 如果boolean在JVM中表示为int,那么它与Java的强类型是如何对应的呢?

java使用代理api声明匿名类

c - C中的多线程TCP聊天

java - Objects.isNull(...)/Objects.nonNull(...) 的用途

java - Android:在 Fragment 中启动 Activity

java - ConcurrentSkipListSet remove() 的问题