java - Java Apache HttClient : ThreadSafe or not?

标签 java multithreading spring apache-httpclient-4.x

我必须创建一个Web服务,该服务通过http请求(方法get)来询问黑匣子。

我想使用Apache http客户端,但是在4.3.1版本中,我对过时的对象和方法有一些警告。

所有示例说明使用ThreadSafe的DefaultHttpClient。
现在我们必须使用不是ThreadSafe的HttClientBuilder。

这到底有什么影响?
愚蠢的问题:如果我在Spring MVC Controller (Singleton线程安全)中使用它,会有什么后果?
线程安全中使用的非线程安全过程是否变为线程安全(lol)?

最佳答案

我不确切知道您想做什么,但是并发是关于线程之间共享状态的全部。如果两个线程并行访问同一状态,则可能/将遇到问题。

请注意,不共享局部变量,因此,如果多个线程并行调用同一方法,则它们都具有自己的局部变量:

public int safeAdd(int a, int b) {
    int sum = a + b;
    return sum;
}

本地变量absum不处于共享状态!每个线程都有自己的“副本”!因此对象是无状态的!

Stateless objects are always thread-safe!



当然,如果发布局部变量,情况会发生变化:
int sum;

public int unsafeAdd(int a, int b) {
    sum = a + b;
    return sum;
}

在这里,sum不再是局部变量。它仅存在一次(每个实例)。如果有多个线程调用unsafeAdd,则可能会/将会发生不好的/意外的事情!

这意味着,如果您仅在自己的方法中使用HttpClientBuilder-没问题。但是,如果发布它(如上例所示),则必须注意并行访问。

(另请参见“实践中的Java并发性”一书:http://jcip.net/)

关于java - Java Apache HttClient : ThreadSafe or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20325975/

相关文章:

java - 如何使用单例实例模拟类

java - Spring框架JDBC使用两个数据源

java - 这两种方法在 java 中 sleep 执行的区别

python - python asyncio call_soon_threadsafe 真的是线程安全的吗?

java - 尝试同步两个线程时遇到问题

java - 在 maven 测试运行中执行时,使用 Spring 注释进行测试会导致 ClosedByInterruptException

java - Maven安装命令报错

java - 仅重定向 HTML 页面一次

java - JPA- hibernate : Map several tables on one column of another

java - 当存在多个版本化的 jar 时,我如何强制从特定版本化的 jar 调用方法