如何在java中使简写递增原子化?
在一个多线程环境中,像如何在java中使简写递增原子化?,java,multithreading,atomic,Java,Multithreading,Atomic,在一个多线程环境中,像i++这样的快速递增必须做比一件事情更多的事情,因此另一个线程可以得到一个中间值 让我们把它分解一下,整数变量的简写增量包含多个操作。首先我们必须加载i的当前值,增加它,然后最后存储新值。执行此增量的当前线程可能在这三个步骤之间中断,因此此操作不是原子操作 我想到的解决方案是:我可以在i++和volatile关键字上使用一个synchronize块,但是有没有更好的方法让i++对每个线程来说都是原子的呢?我已经尝试过使用AtomicInteger,但我仍然认为它在用I+++
i++
这样的快速递增必须做比一件事情更多的事情,因此另一个线程可以得到一个中间值
让我们把它分解一下,整数变量的简写增量包含多个操作。首先我们必须加载i的当前值,增加它,然后最后存储新值。执行此增量的当前线程可能在这三个步骤之间中断,因此此操作不是原子操作
我想到的解决方案是:我可以在
i++
和volatile关键字上使用一个synchronize块,但是有没有更好的方法让i++
对每个线程来说都是原子的呢?我已经尝试过使用AtomicInteger,但我仍然认为它在用I++
+增加速记时不会有帮助,对吗?AtomicInteger及其线程安全方法会起作用,如果您满足于不使用I++
不幸的是,如果您想使用
i++
,它将不是线程安全的incrementAndGet
是线程安全的,为什么您不认为它会有帮助?我不知道这个命令。这正是我想要的,谢谢。++
运算符没有在原子整数上定义。您只能使用它的线程安全成员方法。synchronized
可以工作,但是读取和写入都需要在同一个对象上同步,然后volatile
将是冗余的。