我在某个字段上有一个带有getter getInt()和setter 的类setInt(),例如field
getInt()
setInt()
Integer Int;
说一个类的对象SomeClass。
SomeClass
在setInt()这里synchronized– getInt()不是。
我正在Int从多个线程中更新值。每个线程都在获取值Int,并进行适当设置。线程不会以任何方式共享任何其他资源。
Int
在每个线程中执行的代码如下。
public void update(SomeClass c) { while (<condition-1>) // the conditions here and the calculation of // k below dont have anything to do // with the members of c if (<condition-2>) { // calculate k here synchronized (c) { c.setInt(c.getInt()+k); // System.out.println("in "+this.toString()); } } }
该run()方法只是对通过传递给它的参数从构造函数内部更新的成员调用上述方法:
run()
public void run() { update(c); }
当我按较大的顺序运行此线程时,线程之间的交错并不多-我看到一个线程执行了很长时间,而其他线程之间没有运行。
必须有更好的方法来做到这一点。
我无法更改SomeClass或调用线程的类的内部。
如何更好地做到这一点?
TIA。
// ====================================
编辑:
我不是在操纵线程的执行顺序之后。它们都具有相同的优先级。我在结果中看到的只是暗示这些线程没有平均分配执行时间- 其中一个一旦接管就开始执行。但是,我看不到为什么这段代码应该这样做。
我在结果中看到的只是暗示线程没有平均共享执行时间
好吧,如果您追求效率,这就是您所不想要的。取消执行某个线程并调度另一个线程通常非常昂贵。因此,这样做实际上是有利的one of them, once takes over, executing on。当然,如果这样做过分,您会看到更高的吞吐量,但响应时间更长。理论上。实际上,JVM线程调度已针对几乎所有目的进行了很好的调整,并且您不想在几乎所有情况下都尝试对其进行更改。根据经验,如果您对以毫秒为单位的响应时间感兴趣,则可能要远离混乱。
one of them, once takes over, executing on
tl; dr:这并不是效率低下,您可能希望保持原样。
编辑: 话虽如此,使用an AtomicInteger可能对性能有所帮助,而且我认为比使用lock(synchronized关键字)容易出错。为了获得可衡量的收益,您需要非常努力地达到该变量。
AtomicInteger
synchronized