我必须创建一个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;
}
本地变量
a
,b
和sum
不处于共享状态!每个线程都有自己的“副本”!因此对象是无状态的!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/