【问题标题】:Should I implement synchronization in multi-listener scenarios?我应该在多听众场景中实现同步吗?
【发布时间】:2021-01-14 17:37:50
【问题描述】:

我有一个类有两种不同的监听器方法。一种用于监听不同的消息,另一种用于监听状态更新。

@Override
public void receive(Message message) {
    if (message.getObject() instanceof Boolean) {
        membership.put(message.src(), message.getObject());
        log.info("Membership state updated: {}", membership);
    }
}

@Override
public void setState(InputStream input) throws Exception {
    System.out.println("setState() works");
    Map<Address, Boolean> state = Util.objectFromStream(new DataInputStream(input));
    synchronized (membership) {
        //membership.clear();
        membership.putAll(state);
    }
    log.info("Set new membership state: {}", membership);
}

我没有添加足够的上下文,因为它们对于这个问题是不必要的。这里membership 是一个HashMap,它被两个监听器方法更新。 receive() 被大量使用,但不太重要。但是 setState() 很少使用,但非常关键。

我的问题是:我应该对这两种方法都使用同步吗?如果 setState() 被一个线程(比如 A)调用,而 receive() 仍在由另一个线程(比如 B)执行,我应该担心这种情况下的竞争条件吗?

我真的不想添加synchronized 来接收,因为这会影响性能。

任何见解都非常有帮助。提前致谢。

【问题讨论】:

    标签: java-8 synchronized


    【解决方案1】:

    如果这些方法以及访问membership 的任何其他方法可以由不同的线程同时调用,您将面临竞争条件。您不仅需要考虑更新地图的方法,还需要考虑读取地图的方法。

    通过使用ConcurrentHashMapHashMap 的高度优化的线程安全版本),您可以避免在所有从映射中写入或读取的方法中使用synchronized

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 2020-10-08
      • 1970-01-01
      相关资源
      最近更新 更多