Якщо ваш код знаходиться в процесі, де одночасно працює кілька потоків, він може виконувати цей код одночасно. Якщо результат кожного запуску збігається з результатом одного потоку, а значення інших змінних збігаються з очікуванням, це безпечно для потоку. Інакше кажучи, інтерфейс, який надає клас або програма, є атомарним для потоків або перемикання між кількома потоками не призводить до неоднозначності результату виконання інтерфейсу, що означає, що синхронізація не потрібна. Проблеми безпеки потоків спричинені як глобальними, так і статичними змінними. Якщо кожен потік має лише операції читання для глобальних змінних і статичних змінних, але не має операцій запису, загалом ця глобальна змінна є безпечною для потоків; Якщо кілька потоків одночасно виконують операції читання та запису на змінній, зазвичай потрібна синхронізація потоків, інакше це може вплинути на безпеку потоків.
Мета блокування — запобігти одночасним операціям під час багатопотокового виконання, а об'єкти референтного типу блокування дозволяють одночасно працювати лише одному потоку в його заблокованій зоні.
Блокування може блокувати лише одну змінну типу посилання, тобто заблокувати адресу
Існує різниця між результатами роботи з блокуванням і без нього:
Після блокування: значення i зменшуватиметься поодиноке за одним, не буде стрибків, повторюваних виходів, доки не досягне значення 0;
Немає блокування: вихідне значення i буде стрибати, неперервно зменшуватися, і також може мати вихід -1;
Причина: Після додавання блокування лише один потік може виконувати код у заблокованій області одночасно, і обидва потоки виконуються послідовно, тому переривання вихідного сигналу не буде. |