Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使简写递增原子化?_Java_Multithreading_Atomic - Fatal编程技术网

如何在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
将是冗余的。