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
操作必須是原子性的。我們並發的是系統,而不是操作。