java – 是RestTemplate线程安全吗?

是Spring的RestTemplate线程安全吗?那是

>是一个RestTemplate一个策略对象,多个连接可以安全共享。要么
>是一个RestTemplate一个连接对象(如数据库连接),它不能在使用时共享,并且需要为每个连接重新创建或池化。

最佳答案
RestTemplate is thread safe(加入重点):

Conceptually, it is very similar to the JdbcTemplate, JmsTemplate, and the various other templates found in the Spring Framework and other portfolio projects. This means, for instance, that the RestTemplate is thread-safe once constructed

如果你检查the source code of RestTemplate,你会看到它没有使用同步方法或volatile字段来提供线程安全后,对象的构造。因此,在构造之后修改RestTemplate对象是不安全的。

特别地,添加消息转换器是不安全的。要为其提供消息转换器列表,您必须执行以下操作之一:

>使用RestTemplate(List< HttpMessageConverter<?>> messageConverters)构造函数。由于messageConverters的内部列表是final,这个safely publishes the list of message converters
>使用setMessageConverters(List< HttpMessageConverter<?>> messageConverters)mutator,然后safely-publish更改的RestTemplate对象。在大多数实际用例中,使用具有< property name =“messageConverters”>< list> …的Spring bean定义作为bean will be safely published by the thread setting up the container
>对由getMessageConverters()返回的引用使用List.add,然后安全地发布已更改的RestTemplate对象。但是,RestTemplate的文档没有明确声明它返回可以用于更改消息转换器列表的引用。当前实现确实可能,但是实现可能会更改为返回一个Collections.unmodifiableList或列表的副本。所以最好不要这样改变

转载注明原文:java – 是RestTemplate线程安全吗? - 代码日志