如何在java中没有AtomicInteger的情况下保证原子性?

时间:2015-02-20 15:36:52

标签: java atomic

假设Java 6/7/8:

是否有可能在没有使用例如AtomicInteger?从我的迷你研究来看,似乎一般不可能,但整数/字节/字符操作本身就是原子的(source)。

显然,有synchronized,但此时我想避免它。所以问题是:我可以做atomic(x++)吗?

3 个答案:

答案 0 :(得分:2)

我的建议是:如果您正在进行多线程编程,请尽快开始同步。原子适用于小数据类型,但只要您想从不同的线程访问类实例,就需要考虑同步,使用synchronized或显式操作锁。

虽然单个int读取和写入是原子的,因为它们不会使变量处于不一致状态,但这不是关于原子性的唯一重要事项。特别是现代CPU重新排序指令和缓存内存,因此其他线程可能看不到对变量的更改(这可以通过向变量添加volatile关键字来解决。

此外,AtomicInteger和朋友还提供包含多个操作的操作,例如getAndIncrement()方法,类似于使用postfix ++运算符。这包括读取和写入,如果您不同步或使用AtomicInteger,其他线程可以访问读取和写入之间的变量。

答案 1 :(得分:1)

您的选择是:

  • 通过synchronized关键字
  • 进行内在锁定
  • 使用java.util.concurrent.locks中的显式锁来包装您想要创建原子的操作

答案 2 :(得分:0)

如果要从多个线程读取和写入变量,则需要对变量强加一些原子性。您不能依赖本质上是原子的操作,因为变量的值可以由线程缓存。因此,另一个线程可能无法看到一个线程中的更新。解决此问题的最简单方法是声明变量volatile,以强制读取最新值。 java.util.concurrent类提供了额外的功能和良好的性能。