【发布时间】: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