如何理解memcache的原子性操作?

发布于 2022-09-04 23:55:56 字数 71 浏览 25 评论 0

memcache的 add 是原子性的,即多个进程同时在进行add操作,不会产生竞态条件,这样是不是add 就不会产生并发了??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

难以启齿的温柔 2022-09-11 23:55:56

题主多虑了。正是因为 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 操作必须是原子性的。我们并发的是系统,而不是操作

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文