KafkaProducer线程安全吗?

简介: KafkaProducer线程安全吗?

这是我今天面试被问的一个问题,这会回来就来看看源码

先看KafkaProducer的构造函数

public KafkaProducer(Map<String, Object> configs) {

   this((ProducerConfig)(new ProducerConfig(configs)), (Serializer)null, (Serializer)null);
}


public KafkaProducer(Map<String, Object> configs, Serializer<K> keySerializer, Serializer<V> valueSerializer) {

   this(new ProducerConfig(ProducerConfig.addSerializerToConfig(configs, keySerializer, valueSerializer)), keySerializer, valueSerializer);
}


public KafkaProducer(Properties properties) {

   this((ProducerConfig)(new ProducerConfig(properties)), (Serializer)null, (Serializer)null);
}


public KafkaProducer(Properties properties, Serializer<K> keySerializer, Serializer<V> valueSerializer) {

   this(new ProducerConfig(ProducerConfig.addSerializerToConfig(properties, keySerializer, valueSerializer)), keySerializer, valueSerializer);
}


private KafkaProducer(ProducerConfig config, Serializer<K> keySerializer, Serializer<V> valueSerializer) {

如果我们使用KafkaProducer

我们就看send方法是不是安全

RecordAppendResult result = this.accumulator.append(tp, timestamp, serializedKey, serializedValue, headers, (Callback)interceptCallback, remainingWaitMs);

再看下accumulator 的主要属性

从ConcurrentMap<TopicPartition, Deque<ProducerBatch>> batches;

获取Deque,通过synchronized 进行发送,好了我们知道KafkaProducer是线程安全的,但是KafkaTemplate是线程安全的吗?

双重检测 +volatile

private volatile DefaultKafkaProducerFactory.CloseSafeProducer<K, V> producer;


单例模式,也是线程安全的,官网的话

A template for executing high-level operations. When used with a DefaultKafkaProducerFactory, the template is thread-safe. The producer factory and KafkaProducer ensure this; refer to their respective javadocs.

KafkaTemplate 需要和DefaultKafkaProducerFactory一起使用

相关文章
|
5月前
|
安全
线程安全问题
线程安全问题
43 1
|
6月前
|
安全 Java 关系型数据库
多线程(线程安全)
多线程(线程安全)
52 4
|
6月前
|
存储 安全 Java
我们来聊聊线程安全吧
我们来聊聊线程安全吧
|
缓存 安全 Java
认识线程安全和解决线程安全
认识线程安全和解决线程安全
|
6月前
|
安全 编译器 调度
多线程之线程安全问题
多线程之线程安全问题
|
安全 Java 编译器
深入理解线程安全
在多线程编程中,线程安全是一个至关重要的概念。线程安全可能到导致数据不一致,应用程序崩溃和其他不可预测的后果。本文将深入探讨线程安全问题的根本原因,并通过Java代码示例演示如何解决这些问题。
143 0
|
安全 Java 编译器
关于线程安全问题
关于线程安全问题
102 0
|
存储 安全
什么时候考虑线程安全?
什么时候考虑线程安全?
101 0
|
安全 Java 调度
什么是线程安全的?
首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的工作内存,一个线程对一个variable进行操作时,都要在自己的工作内存里面建立一个copy,操作完之后再写入主内存。多个线程同时操作同一个variable,就可能会出现不可预知的结果。
93 0
|
存储 开发框架 算法
线程安全
线程安全
83 0