我有一个使用static synchronized
方法进行HTTP调用的类。
我还有ExecutorService
。
有多个Runnable类调用此方法。该方法将接受URL,POST / GET信息和参数,如果响应不是200,则返回错误代码,或者由Runnable类进一步处理XML字符串。
如果多个线程在放入ExecutorService
后调用此方法,这可以吗?它会失败吗?
通过ExecutorService
处理多个HTTP呼叫的理想方式是什么?
答案 0 :(得分:2)
关于“线程安全”的任何问题都必须是关于可变共享数据的问题。除非你的线程共享可变数据,否则没有线程安全问题。
程序中的可变对象或一组可变对象是“线程安全”,如果任何一个线程的动作都不可能将对象/组置于其他可以看到的“坏”状态线程。
保证对象/组的线程安全的最简单,最常用的方法是使用互斥(即synchronized
块和/或方法)。如果修改或READS 数据的每个方法仅在同一对象的所有synchronized
内部代码块内完成,并且mutator函数始终确保对象/组在在离开任何synchronized
块之前的有效状态,那么该对象/组将是“线程安全的”。
您的问题没有提及任何数据。您的问题没有提到数据是否存在任何可能存在的“无效”状态。您的问题涉及一种方法,但没有提及是否有任何其他方法可以访问相同的数据。
如果有问题的方法是static
和synchronized
,那么这将保证没有两个线程能够同时进入该方法,但这不会产生数据“线程安全”,如果有任何其他方法访问或修改相同的数据。
访问数据的所有代码块和/或方法必须是synchronized
,并且它们必须在同一个锁对象上同步。
实际上,同步每次访问可能都是过度的。但是,如果不知道线程共享哪些数据,以及他们对数据做了什么,就无法知道。
这都与数据有关。
答案 1 :(得分:1)
是的,它是Java中synchronize
标签的要点:)
就像在函数开头锁定互斥锁一样,在返回时解锁同一个互斥锁。
在这种情况下,互斥锁是按对象方式的,因此调用同步方法将锁定其他方法。注意
答案 2 :(得分:0)
让ExecutorService任务调用静态同步方法将成为瓶颈。一次只能有一个线程执行此方法。
如果ExecutorService中的所有任务都需要进行此调用,那么您将失去拥有多个线程的目的,因为大多数线程可能会花时间等待获取类上的监视器,以便它们可以调用静态方法。
静态同步方法用于保护共享状态免受不安全的并发访问。为每个任务提供自己的状态并尽可能地消除共享比让所有线程轮流访问共享资源要好得多。