我应该在多侦听器场景中实现同步吗?
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
的高度优化的线程安全版本。
我有一个 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
的高度优化的线程安全版本。