Я не уверен, что это гарантировано будет безопасным. Представьте, что у вас есть байт []. Эти байты плотно упакованы в память. Теперь, если вы измените эти байты, компилятор может объединить некоторые из операций записи для выполнения операций чтения с записью (32 бит) размера. Например, на некоторых процессорах ARM это единственный вид команды модификации памяти, которую имеет компилятор. Это особенно удобно, если вы изменяете более одного байта за раз. Процессор может сделать то же самое. Он также может переупорядочить материал, не зная об этом. Перед лицом такой оптимизации можно, чтобы поток, читающий смежную память, мог видеть частичные модификации. Вы не видите такого эффекта, потому что распределитель кучи хорош для вас и всегда дает вам память, которая по крайней мере выравнивается по слову.
Пока эти элементы находятся в отдельных словах CPU – Stewart
+1 Никогда не думал, что это будет потокобезопасным, но я понимаю, почему это так. Благодаря! –
Важно учитывать при использовании алгоритмов блокировки, что то, что вы считаете «одной и той же позицией», не совпадает с тем, что CPU (ы) считают одной и той же позицией. Представление CPU о памяти сильно отличается от языков представления, таких как C, где мы занимаем адреса байтов. На некоторых архитектурах процессора (особенно ARM, Power) на некоторых типах данных даже это может быть небезопасно. – Stewart