Java Apache HttpClient:线程安全与否?

时间:2013-12-02 10:26:26

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

我必须创建一个Web服务,通​​过http请求(方法获取)查询黑盒子。

我想使用Apache http客户端,但是对于4.3.1版本,我对已弃用的对象&方法

所有示例都解释使用DefaultHttpClient是ThreadSafe。 现在我们必须使用不是ThreadSafe的HttClientBuilder。

究竟是什么影响? 愚蠢的问题:如果我在Spring MVC Controller(Singleton threadsafe)中使用它,会产生什么后果? 线程安全中使用的非线程安全进程是否成为线程安全(lol)?

3 个答案:

答案 0 :(得分:3)

下面的代码会返回CloseableHttpClient,如果你看起来是线程安全的。

HttpClientBuilder.create().build();

答案 1 :(得分:2)

我不确切地知道你想做什么,但并发性就是在线程之间共享状态。如果两个线程并行访问相同的状态,您可能会遇到问题。

请注意,局部变量不是共享的,因此如果多个线程并行调用相同的方法,则所有这些线程都有自己的局部变量:

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

局部变量absum不是共享状态!每个线程都有自己的'副本'!所以对象是无国籍的!

  

无状态对象始终是线程安全的!

当然,如果您发布局部变量,事情会发生变化:

int sum;

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

此处,sum不再是局部变量。它只存在一次(每个实例)。如果多个线程调用unsafeAdd,那么可能/将会发生错误/意外的事情!

这意味着,如果您只在方法中使用HttpClientBuilder - 没问题。但是如果你发布它(如上例所示),你必须处理并行访问。

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

答案 2 :(得分:1)

似乎你需要先了解哪些线程安全意味着什么。

X类是线程安全的,通常意味着如果你 有一个类变量Y(类型X),你可以使用它 多线程,这不会导致任何问题 (例如,因为X的公共方法被保护/同步)。

说一个线程/进程是线程安全的 或不 - 这没有多大意义,它是关于 这些类的类和对象。

当一个类不是线程安全的时候你可以使用 此类的对象作为局部变量 而且不用担心线程安全。

那是因为局部变量不是 跨线程共享,每个线程都有 它自己的副本。

但是如果你将它用作类变量 你可能遇到线程安全问题。