Однажды я прочитал очень хорошее объяснение о так называемых неатомарных и атомарных (в VB: взаимосвязанных) операциях и постараюсь подвести итог.
Normal "non-atomic" operations consist of several steps
-> между этими стропами могут работать другие потоки
"Atomic" operations consist of one only one step
-> другие потоки не могут выполнять работу, пока атомарные операции обрабатываются, атомарные операции всегда обрабатываются как единое целое
Класс блокировки - это набор таких атомарных операций, поэтому он по определению безопасен для потоков.
Даже если несколько потоков выполняют операции чтения и записи для одной и той же переменной, эти операции абсолютно поточнобезопасны.
Тем не менее комбинация этих потоковобезопасных команд может быть небезопасной, поскольку между атомарными операциями могут возникать условия гонки.
Так что, если вы хотите, например, сравнить 2 переменные, а затем увеличить меньшую, это не является потокобезопасным, хотя отдельные операции для них выполняются (interlocked.compare, interlocked.increment).
Здесь вам еще нужно использовать синхронизаторы.
Кроме этого ограничения нет "скрытой плохой стороны" блокировки.
Один пример для условия гонки с = 5:
Thread1: a+=1
Thread2: a+=2
--> supposed to be 8, but can be only 6 or 7,
but can also be 6 or 7 depending on which thread wins the race
вариант 1:
T1 step 1: read 5
T1 step 2: add 1 = 6
T1 step 3: write 6
T2 step 1: read 6
T2 step 2: add 2 = 8
T2 step 3: write 8
--> is 8 as supposed
или вариант 2:
T1 step 1: read 5
T2 step 1: read 5
T1 step 2: add 1 = 6
T2 step 2: add 2 = 7
T2 step 3: write 7
T1 step 3: write 6
--> is only 6
или вариант 3:
T1 step 1: read 5
T2 step 1: read 5
T1 step 2: add 1 = 6
T2 step 2: add 2 = 7
T1 step 3: write 6
T2 step 3: write 7
--> is only 7
С блокированным инкрементом:
вариант 1:
T1 step 1: read 5, add 1, write 6
T2 step 1: read 6, add 2, write 8
или вариант 2:
T2 step 1: read 5, add 2, write 7
T1 step 1: read 7, add 1, write 8
-> во всех случаях a = 8, как предполагается, многопоточное решение
Все вопросы, которые были размещены здесь, можно решить, применив этот простой пример к сомнительному коду.
Надеюсь, это поможет другим людям, которые погуглили эту тему.
Janis