题主多虑了。正是因为 add 的原子性,我们才能够放心的并发。 你对底层概念了解的不够。 我们说一个操作的并发是没有意义的。 a = b + c; 上面的语句是原子性的吗?上面的语句可以并发吗? a = getValueOfB() + getValueOfC(); 上面的呢? a = add(getValueOfB(), getValueOfC()); 这个呢? + 是原子性的,那么 + 就不能并发了吗?不是。 我们设想一个任何操作都不是原子性的世界。 拿一个最简单的 i++ 举例吧: i 的值是 4。 此时 2 个线程同时执行 i++。(姑且认为同时就是你说的并发吧) i++ 是怎么执行的呢? 首先要获取 i 的值。 把 i 的值加 1 最终结果存入 i 此时如果 i++ 不是原子性的,那么 2 个线程就会出现 各种执行顺序,从而得到错误的结果。 第一个线程取得了 i 的值是 4 第二个线程取得了 i 的值是 4 第一个线程把 i 加 1,得到 5 第二个线程把 i 加 1,得到 5 第一个线程把 5 存入 i 第二个线程把 5 存入 i 得到最终结果,i 是 5。显然这个结果是错误的。 但是我们却没有遇到过这种情况,因为 i++ 是原子性的。 那么原子性的是不是就无法并发了?是的。 who care 从使用者角度讲,add 操作必须是原子性的。我们并发的是系统,而不是操作。
题主多虑了。正是因为
add
的原子性,我们才能够放心的并发。你对底层概念了解的不够。
我们说一个操作的并发是没有意义的。
上面的语句是原子性的吗?上面的语句可以并发吗?
上面的呢?
这个呢?
+
是原子性的,那么+
就不能并发了吗?不是。我们设想一个任何操作都不是原子性的世界。
拿一个最简单的
i++
举例吧:i
的值是4
。此时 2 个线程同时执行
i++
。(姑且认为同时就是你说的并发吧)i++
是怎么执行的呢?首先要获取 i 的值。
把 i 的值加 1
最终结果存入 i
此时如果 i++ 不是原子性的,那么 2 个线程就会出现 各种执行顺序,从而得到错误的结果。
第一个线程取得了 i 的值是 4
第二个线程取得了 i 的值是 4
第一个线程把 i 加 1,得到 5
第二个线程把 i 加 1,得到 5
第一个线程把 5 存入 i
第二个线程把 5 存入 i
得到最终结果,i 是 5。显然这个结果是错误的。
但是我们却没有遇到过这种情况,因为 i++ 是原子性的。
那么原子性的是不是就无法并发了?是的。
who care
从使用者角度讲,
add
操作必须是原子性的。我们并发的是系统,而不是操作。