Перейти до основного контенту

Принцип роботи synchronized в мові Java

12 хв читання
1191 переглядів
Одним із ключових механізмів для забезпечення безпеки багатопоточних додатків у мові програмування Java є ключове слово synchronized. Воно дозволяє синхронізувати доступ до спільних ресурсів, блокуючи їх виконання одночасно кількома потоками.Принцип роботи synchronized полягає в тому, що кожен об’єкт у Java має внутрішній монітор, який використовується для синхронізації. Коли потік намагається виконати блок коду, помічений як synchronized, він спочатку має захопити монітор об’єкта, до якого належить блок коду.Якщо монітор об’єкта заблокований іншим потоком, потік, що намагається виконати synchronized-блок, буде чекати, поки монітор не звільниться. Після того, як монітор буде отримано, потік виконає код у synchronized-блоці, а потім звільнить монітор, дозволяючи іншим потокам захопити його.виконати свої synchronized-блоки.Ключове слово synchronized дозволяє гарантувати, що тільки один потік буде виконувати блок коду, позначений як synchronized, в певний момент часу, що запобігає виникненню стану гонки та невизначеної поведінки. Таким чином, synchronized-блоки дозволяють забезпечити правильну і узгоджену роботу багатопоточних додатків у Java.Механізм синхронізації потоківУ мові Java механізм синхронізації реалізується за допомогою ключового слова synchronized. Воно може застосовуватись до методів та блоків коду.Коли метод або блок коду оголошено як synchronized, то доступ до них синхронізований і може бути виконаний тільки одним потоком у певний момент часу. Інші потоки будуть чекати, поки ресурс не буде звільнено.Для використання синхронізаціїдля потоків необхідно вказати об'єкт або клас, на якому буде відбуватися синхронізація. Це може бути об'єкт-монітор, який забезпечує взаємо виключення та контроль доступу до ресурсів. Зазвичай об'єкт-монітор є спільним ресурсом, до якого мають доступ кілька потоків.Синхронізація потоків дозволяє уникнути стану гонки, коли кілька потоків намагаються одночасно отримати доступ до одного і того ж ресурсу, що може призвести до непередбачуваної поведінки програми. Вона також забезпечує атомарність операцій, тобто гарантує, що одна операція буде виконана цілком без переривання іншими потоками.Блокування та монітори в мові JavaВ мові Java існує механізм синхронізації, який дозволяє забезпечити безпечний доступ до спільного ресурсу кількома потоками. Для цього використовується ключове слово synchronized, завдяки якому можна створювати блокування та монітори.

Блокування в мові Java є механізмом, що дозволяє потоку захопити доступ до спільного ресурсу та утримувати його, поки блокування не буде звільнено. Це забезпечує синхронізований доступ до загальної пам’яті та запобігає стану гонки.

Монітор у мові Java є концепцією, пов’язаною з блокуваннями. Він представляє собою абстрактний об’єкт, з яким пов’язане блокування. До монітора може бути прив’язаний лише один потік, який володіє блокуванням і має до нього ексклюзивний доступ. Якщо інший потік намагається отримати доступ до заблокованого монітора, він буде заблокований і чекає, поки монітор не буде звільнений.

Ключове слово synchronized використовується для створення блокувань і моніторів у Java. Воно може бути використано в кількох формах, у тому числі для блокування методів, блоків коду або полів об’єктів. Коли потік заходить у заблокований код, він отримує доступ до монітора, пов'язаному з цим кодом, і інший потік не може отримати доступ до цього монітора, поки він не буде звільнений.Форма використанняОписsynchronized методБлокує доступ до цілого методу, що дозволяє тільки одному потоку виконувати його в будь-який момент часу.synchronized(this)Блокує доступ до блоку коду, виконання якого може бути здійснене тільки одним потоком одночасно.synchronized(об'єкт)Блокує доступ до блоку коду, виконання якого може бути здійснене тільки одним потоком одночасно. В якості об'єкта блокування може бути використаний будь-який об'єкт.synchronized static методБлокує доступ до цілого статичного методу, що дозволяє тільки одному потоку виконувати його в будь-який момент часу.synchronized(клас.class)Блокує доступ до блоку.код, виконання якого може бути здійснене лише одним потоком одночасно. Як об'єкт блокування використовується клас.Синхронізація коду за допомогою ключового слова synchronized є одним з основних механізмів у мові Java для забезпечення безпеки роботи з потоками. Однак слід бути обережним з його використанням, щоб уникнути проблем з продуктивністю та дедлоками.Приклади використання synchronizedПри роботі з потоками в мові Java, ключове слово synchronized відіграє важливу роль у забезпеченні правильної синхронізації доступу до спільних ресурсів. Розглянемо кілька прикладів використання synchronized для забезпечення безпеки роботи зі спільними даними.Приклад 1:Нехай у нас є клас Counter, який представляє лічильник з методами increment() і decrement(). Якщо ми не будемо використовувати synchronized, то можлива ситуація, коли два потоки одночасно збільшать лічильник, що призведе до невірних результатів. Щоб уникнути такої ситуації, можна використовувати synchronized для блокування звернень до методів increment() та decrement():Тепер доступ до методів increment() та decrement() буде здійснюватися надійно, оскільки тільки один потік зможе змінювати значення лічильника в один момент часу.Приклад 2:Іншим поширеним прикладом використання synchronized є робота з колекціями, які використовуються в кількох потоках. Наприклад, розглянемо наступний код:Тут ми використали блокування за об'єктом list під час додавання та видалення елементів. Таким чином, ми гарантуємо, що тільки один потік може змінювати список в один момент часу. Крім того, при поверненні елементів списку методом getList() ми створюємо його копію за допомогоюновий ArrayList<>(список), щоб уникнути можливої конкуренції за доступ до елементів.Приклади використання synchronized дозволяють забезпечити безпеку роботи з спільними даними в багатопотоковому середовищі та уникнути ситуацій гонки і непередбачуваного поводження програми.