为什么 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
.
我正在阅读 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
.