为什么 Spring KafkaTemplate 没有将其实例变量 "messageConverter" 设置为 volatile?

Why Spring KafkaTemplate doesn't set its instance variable "messageConverter" to volatile?

我正在阅读 Spring KafkaTemplate(org.springframework.kafka.core) 的源代码并遇到了这段代码:

protected final Log logger = LogFactory.getLog(this.getClass()); //NOSONAR

private final ProducerFactory<K, V> producerFactory;

private final boolean autoFlush;

private final boolean transactional;

private final ThreadLocal<Producer<K, V>> producers = new ThreadLocal<>();

private RecordMessageConverter messageConverter = new MessagingMessageConverter();

private volatile String defaultTopic;

private volatile ProducerListener<K, V> producerListener = new LoggingProducerListener<K, V>();

如您所见,像 defaultTopic 和 producerListener 这样的变量被设置为 volatile,我认为一旦更改它们就会使它们在内存中可见。

所以我很困惑为什么 meesageConverter 没有设置成相同的。

我们通常不希望配置属性(例如消息转换器)在运行时更改,因此无需使其可变。如果您有这样的要求,请子类化模板并使用 synchronized 方法(调用 super.set...())覆盖 setter。

您正在查看旧版本的代码;这些变量不再是 volatile.