84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
memcache的 add 是原子性的,即多个进程同时在进行add操作,不会产生竞态条件,这样是不是add 就不会产生并发了??
光阴似箭催人老,日月如移越少年。
题主多虑了。正是因为 add 的原子性,我们才能够放心的并发。
add
你对底层概念了解的不够。
我们说一个操作的并发是没有意义的。
a = b + c;
上面的语句是原子性的吗?上面的语句可以并发吗?
a = getValueOfB() + getValueOfC();
上面的呢?
a = add(getValueOfB(), getValueOfC());
这个呢?
+ 是原子性的,那么 + 就不能并发了吗?不是。
+
我们设想一个任何操作都不是原子性的世界。
拿一个最简单的 i++ 举例吧:
i++
i 的值是 4。
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
操作必须是原子性的。我们并发的是系统,而不是操作。