我必须创建一个Web服务,通过http请求(方法获取)查询黑盒子。
我想使用Apache http客户端,但是对于4.3.1版本,我对已弃用的对象&方法
所有示例都解释使用DefaultHttpClient是ThreadSafe。 现在我们必须使用不是ThreadSafe的HttClientBuilder。
究竟是什么影响? 愚蠢的问题:如果我在Spring MVC Controller(Singleton threadsafe)中使用它,会产生什么后果? 线程安全中使用的非线程安全进程是否成为线程安全(lol)?
答案 0 :(得分:3)
下面的代码会返回CloseableHttpClient,如果你看起来是线程安全的。
HttpClientBuilder.create().build();
答案 1 :(得分:2)
我不确切地知道你想做什么,但并发性就是在线程之间共享状态。如果两个线程并行访问相同的状态,您可能会遇到问题。
请注意,局部变量不是共享的,因此如果多个线程并行调用相同的方法,则所有这些线程都有自己的局部变量:
public int safeAdd(int a, int b) {
int sum = a + b;
return sum;
}
局部变量a
,b
和sum
不是共享状态!每个线程都有自己的'副本'!所以对象是无国籍的!
无状态对象始终是线程安全的!
当然,如果您发布局部变量,事情会发生变化:
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的公共方法被保护/同步)。
说一个线程/进程是线程安全的 或不 - 这没有多大意义,它是关于 这些类的类和对象。
当一个类不是线程安全的时候你可以使用 此类的对象作为局部变量 而且不用担心线程安全。
那是因为局部变量不是 跨线程共享,每个线程都有 它自己的副本。
但是如果你将它用作类变量 你可能遇到线程安全问题。