Если ваш код находится в процессе, где одновременно работают несколько потоков, возможно, он выполняет этот код одновременно. Если результат каждого запуска совпадает с результатом одного потока, а значения других переменных совпадают с ожидаемостью, это считается потоком безопасным. Другими словами, интерфейс, предоставляемый классом или программой, атомарен для потоков, или переключение между несколькими потоками не приводит к неоднозначности в результате выполнения интерфейса, что означает, что нам не нужно учитывать синхронизацию. Проблемы с безопасностью потоков вызваны как глобальными, так и статическими переменными. Если в каждом потоке есть операции чтения только для глобальных и статических переменных, но нет операций записи, обычно эта глобальная переменная безопасна для потоков; Если несколько потоков выполняют операции чтения и записи на переменной одновременно, обычно требуется синхронизация потоков, иначе это может повлиять на безопасность потоков.
Цель блокировки — предотвратить параллельные операции при многопоточном выполнении, а объекты эталонного типа блокировки позволяют одновременно работать только один поток в своей заблокированной области.
Lock может заблокировать только одну переменную типа опоры, то есть заблокировать адрес
Существует разница между результатами работы с блокировкой и без неё:
После блокировки: значение i будет уменьшаться постепенно, не будет скачков, не будет повторяющихся выводов, пока не достигнет значения 0;
Нет блокировки: выходное значение i будет прыгать, уменьшаясь прерывисто, и также может иметь выходное значение -1;
Причина: после добавления блокировки только один поток может одновременно выполнять код в заблокированной области, и оба потока выполняются по порядку, поэтому прерванного вывода не будет. |