假设Java 6/7/8:
是否有可能在没有使用例如AtomicInteger
?从我的迷你研究来看,似乎一般不可能,但整数/字节/字符操作本身就是原子的(source)。
显然,有synchronized
,但此时我想避免它。所以问题是:我可以做atomic(x++)
吗?
答案 0 :(得分:2)
我的建议是:如果您正在进行多线程编程,请尽快开始同步。原子适用于小数据类型,但只要您想从不同的线程访问类实例,就需要考虑同步,使用synchronized
或显式操作锁。
虽然单个int
读取和写入是原子的,因为它们不会使变量处于不一致状态,但这不是关于原子性的唯一重要事项。特别是现代CPU重新排序指令和缓存内存,因此其他线程可能看不到对变量的更改(这可以通过向变量添加volatile
关键字来解决。
此外,AtomicInteger
和朋友还提供包含多个操作的操作,例如getAndIncrement()
方法,类似于使用postfix ++
运算符。这包括读取和写入,如果您不同步或使用AtomicInteger
,其他线程可以访问读取和写入之间的变量。
答案 1 :(得分:1)
您的选择是:
synchronized
关键字java.util.concurrent.locks
中的显式锁来包装您想要创建原子的操作答案 2 :(得分:0)
如果要从多个线程读取和写入变量,则需要对变量强加一些原子性。您不能依赖本质上是原子的操作,因为变量的值可以由线程缓存。因此,另一个线程可能无法看到一个线程中的更新。解决此问题的最简单方法是声明变量volatile
,以强制读取最新值。 java.util.concurrent类提供了额外的功能和良好的性能。