Java原子方法定义辨析:是否真的是‘要么全有要么全无’?
原子性(Atomic)与事务性(Transactional)的术语辨析
你的术语理解
- 原子性(并发领域):当多个线程并发或顺序调用同一方法时,原子方法的执行结果和线程顺序执行时的结果完全一致,核心是保证并发场景下的执行等价性。
- 事务性(工作单元领域):事务性任务遵循「要么成功要么失败」的原则,执行过程中不会留下中间脏状态,失败时会回滚到初始状态。
争议的定义
有文章提出的原子方法定义:
若方法具备“要么全有要么全无”的特性,则为原子方法。线程读取数据时,仅能看到原子方法执行前或执行后的状态——无中间状态。原子方法执行成功后,变更对所有线程可见,且仅修改自身对象数据,无副作用。
你认为这个定义不准确,并给出了如下代码示例:
public synchronized void add(){ x++; if(System.currentTimeMillis()%10==0){ throw new RuntimeException(); } y++; }
你认为这段代码是原子方法,但存在抛出异常的副作用。
结论
你的理解更贴合并发领域对原子性的核心定义:
- 并发原子性的核心是执行结果的一致性——无论线程是并发还是顺序执行,最终状态等价。你给出的
synchronized方法满足这一点:多个线程调用时,要么完整执行x++和y++,要么只执行x++后抛出异常,不会出现多个线程交叉修改x、y的情况,最终状态和单线程顺序执行的结果一致,因此属于原子方法。 - 文章定义里的「无副作用」是额外强加的限制,并发原子性并不要求方法没有副作用,只要求并发执行的结果等价于串行执行的结果。
- 事务性和并发原子性确实是两个领域的概念:事务性聚焦于工作单元的完整性(失败回滚),而并发原子性聚焦于并发执行下的状态一致性。
内容的提问来源于stack exchange,提问作者Fatih Arslan
相关产品推荐
相关产品推荐

