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