如何在 Java 中以原子方式和线程安全地修改 int?
原子增量、测试和设置等...?
线程安全可以通过同步函数来实现。将您的 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 变量重新排序。这意味着您仍然遭受以下痛苦:
问题。
private final static AtomicInteger at = new AtomicInteger();
public void run() {
at.set(7);
int i = at.incrementAndGet();