Java 相当于 .Net 的 Interlocked 类是啥?
Posted
技术标签:
【中文标题】Java 相当于 .Net 的 Interlocked 类是啥?【英文标题】:What's Java's equivalent of .Net's Interlocked class?Java 相当于 .Net 的 Interlocked 类是什么? 【发布时间】:2009-07-20 08:25:05 【问题描述】:如何在 Java 中以原子方式和线程安全地修改 int?
原子增量、测试和设置等...?
【问题讨论】:
【参考方案1】:使用AtomicInteger。
【讨论】:
如果您只需要它提供的有限的一组操作,这很好。问题中的“等”表示更灵活。 是吗?如果他在寻找更多,他应该更明确。与此同时,AtomicInteger 似乎是正确的答案 还可以查看 java.util.concurrent 包中的其他类。它们对“etc”-stuff 有帮助【参考方案2】:线程安全可以通过同步函数来实现。 将您的 int(或此类数据)包装在一个通过同步方法提供所需功能的类中,例如
public class X
protected int x;
public synchronized void set( int value )
x = value;
您还可以使用 java.util.concurrent.atomic 包中的类,例如AtomicInteger 或 AtomicIntegerArray
为什么这个答案不起作用
我只是想明确指出这个答案有什么问题,以防万一synchronized
可以用来解决线程竞争效应的任何事情
| Thread A | Thread B |
|---------------|------------------|
| read x (x=4) | |
| | read x (x=4) |
| Calculate 4+1 | |
| EAX ← 5 | |
| | Calculate 4+1 |
| | EAX ← 5 |
| Start sync | |
| | Start sync |
| x ← 5 | wait |
| | wait |
| End sync | wait |
| | |
| | x ← 5 |
| | |
| | End sync |
操作的最终结果:
x = 4;
x += 1;
x += 1;
是 x = 5 而不是 6。
volatile
关键字也存在同样的问题。 volatile
关键字不会让您摆脱线程效应。 volatile 关键字仅确保
严格来说,volatile
确保内存操作不会围绕 volatile 变量重新排序。这意味着您仍然会遭受:
问题。
【讨论】:
Synchronized 的重量相当大,并不能真正作为 Interlocked 的有效替代品。人们使用 Interlocked 是因为它既快速又轻便。【参考方案3】:private final static AtomicInteger at = new AtomicInteger();
public void run()
at.set(7);
int i = at.incrementAndGet();
【讨论】:
以上是关于Java 相当于 .Net 的 Interlocked 类是啥?的主要内容,如果未能解决你的问题,请参考以下文章