为什么 LogbackMDC 会跟踪上次操作?

Why LogbackMDC keep track of last operation?

我正在查看 LogbackMDCAdapter 的实现,它跟踪 lastOperation 我不明白这样做的原因,有人知道为什么这样做吗?

而且,为什么需要 duplicateAndInsertNewMap

根据评论here,出于序列化目的需要复制地图

Each time a value is added, a new instance of the map is created. This is to be certain that the serialization process will operate on the updated map and not send a reference to the old map, thus not allowing the remote logback component to see the latest changes.

这指的是 ObjectOutputStream 发送对先前写入的对象而不是完整对象的引用的行为,除非使用 writeUnshared 方法。

除非有 get/put 组合,否则为什么可以跳过复制不是很明显,但显然即使你连续有多个 put 操作,序列化也会正常工作只要因为只有在 get 之后立即执行 put/remove 时才会复制地图。所以这是一个 performance optimization 来避免在放置多个项目时不必要地复制地图。