我应该在多侦听器场景中实现同步吗?

Should I implement synchronization in multi-listener scenarios?

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

@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接收,因为这会影响性能。

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

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

您可以避免在所有写入或读取地图的方法中使用 synchronized,方法是使用 ConcurrentHashMap,这是 HashMap 的高度优化的线程安全版本。