我明白使用AtomicInteger来递增共享的int值比使用synchronized块更好。但是,对于多个int值呢?
以下哪种方法更好?为什么?是否有更好的方法来提高性能?
1) 使用同步块:
int i, j, k, l;
public void synchronized incrementValues() {
i++;j++;k++;l++;
}
2) 使用AtomicInteger:
AtomicInteger i,j,k,l;
// Initialize i, j, k, l
public void incrementValues() {
i.incrementAndGet();
j.incrementAndGet();
k.incrementAndGet();
l.incrementAndGet();
}
如果我使用 ReentrantLock ,那会更快吗?
3) 使用ReentrantLock:
ReentrantLock lock = new ReentrantLock()
int i, j, k, l;
public void incrementValues() {
lock.lock();
try {
i++;j++;k++;l++;
} finally {
lock.unlock();
}
}
以下是我的问题:
- 3是否是最快的?
- 2呢?对于单个整数,2比1更快。如果整数数量增加,2会变得比1慢吗?
编辑1基于Matthias的答案修改问题。
i、j、k、l彼此独立。各自的增量应该是原子的,而不是整个的。如果线程2在线程1修改k之前修改了i,则可以。
编辑2根据迄今为止的评论提供的附加信息。
我并不要求得到确切的答案,因为我理解这取决于函数的使用方式和争用的数量等,并且针对每个用例进行测量是确定确切答案的最佳方法。但是,我希望看到人们分享他们的知识/文章等,以阐明影响情况的参数/优化。感谢@Marco13的文章。它很有启发性。
AtomicIntegerArray
也是不错的选择。我想我会选择synchronized
,因为它是最简单的,而且在这种情况下可能是最好的。 - Bubletansynchronized
变得更快的点)的结果进行比较 - 即使是这样,您也很难知道像锁消除或粗化(http://www.ibm.com/developerworks/library/j-jtp10185/index.html)这样的事情是否扭曲了结果变得毫无意义... - Marco13