Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Синхронізація Потоків | Основи Багатопотоковості
Багатопотоковість у Java

bookСинхронізація Потоків

Синхронізовані методи та блоки

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

Приклад із реального життя: Уявіть собі склад з одним входом і виходом. Якщо кілька людей намагаються скористатися одними й тими ж дверима одночасно, це може спричинити хаос. Синхронізація у програмуванні діє як контролер біля дверей, дозволяючи проходити лише одній людині за раз, щоб уникнути зіткнень.

Синхронізовані методи

Коли метод оголошується з ключовим словом synchronized, він автоматично блокує об'єкт, до якого належить цей метод, на час його виконання.

Приклад коду

Main.java

Main.java

copy
123
public synchronized void increment() { //Adding the synchronized count++; }

У цьому прикладі метод increment() є синхронізованим, тобто лише один потік може виконувати цей метод у будь-який момент часу.

Синхронізовані блоки

Синхронізовані блоки дозволяють синхронізувати лише певну ділянку методу, що корисно, якщо потрібно синхронізувати лише конкретну частину коду.

Приклад коду

Main.java

Main.java

copy
12345
public void increment() { synchronized(this) { count++; } }

У цьому прикладі лише код всередині synchronized(this) синхронізується, що підвищує продуктивність, якщо вся метод не потребує синхронізації.

Note
Примітка

У блоці synchronized(this) ключове слово this означає, що блок коду синхронізується на поточному екземплярі об'єкта, тобто на об'єкті, для якого викликається цей метод.

Монітори об'єктів

Коли потік отримує монітор об'єкта, він отримує виключний доступ до синхронізованих методів або блоків цього об'єкта. Інші потоки, які намагаються отримати доступ до синхронізованих методів або блоків того ж об'єкта, будуть заблоковані до тих пір, поки монітор не буде звільнений.

Методи wait(), notify(), notifyAll()

Метод wait() використовується для призупинення виконання поточного потоку та звільнення зайнятих ним ресурсів до тих пір, поки інший потік не викличе метод notify() або notifyAll() для того ж монітора об'єкта.

Методи notify() та notifyAll() використовуються для відновлення виконання одного або всіх потоків, заблокованих на моніторі об'єкта.

Note
Примітка

Методи wait(), notify() та notifyAll() повинні викликатися всередині синхронізованого блоку, пов'язаного з тим самим монітором об'єкта, що й очікуючий потік, для забезпечення коректної синхронізації.

У наступному розділі ми розглянемо, що може статися, якщо не використовувати синхронізацію.

1. Що робить ключове слово synchronized у Java?

2. Як працює монітор об'єкта у Java?

question mark

Що робить ключове слово synchronized у Java?

Select the correct answer

question mark

Як працює монітор об'єкта у Java?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 4

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Awesome!

Completion rate improved to 3.33

bookСинхронізація Потоків

Свайпніть щоб показати меню

Синхронізовані методи та блоки

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

Приклад із реального життя: Уявіть собі склад з одним входом і виходом. Якщо кілька людей намагаються скористатися одними й тими ж дверима одночасно, це може спричинити хаос. Синхронізація у програмуванні діє як контролер біля дверей, дозволяючи проходити лише одній людині за раз, щоб уникнути зіткнень.

Синхронізовані методи

Коли метод оголошується з ключовим словом synchronized, він автоматично блокує об'єкт, до якого належить цей метод, на час його виконання.

Приклад коду

Main.java

Main.java

copy
123
public synchronized void increment() { //Adding the synchronized count++; }

У цьому прикладі метод increment() є синхронізованим, тобто лише один потік може виконувати цей метод у будь-який момент часу.

Синхронізовані блоки

Синхронізовані блоки дозволяють синхронізувати лише певну ділянку методу, що корисно, якщо потрібно синхронізувати лише конкретну частину коду.

Приклад коду

Main.java

Main.java

copy
12345
public void increment() { synchronized(this) { count++; } }

У цьому прикладі лише код всередині synchronized(this) синхронізується, що підвищує продуктивність, якщо вся метод не потребує синхронізації.

Note
Примітка

У блоці synchronized(this) ключове слово this означає, що блок коду синхронізується на поточному екземплярі об'єкта, тобто на об'єкті, для якого викликається цей метод.

Монітори об'єктів

Коли потік отримує монітор об'єкта, він отримує виключний доступ до синхронізованих методів або блоків цього об'єкта. Інші потоки, які намагаються отримати доступ до синхронізованих методів або блоків того ж об'єкта, будуть заблоковані до тих пір, поки монітор не буде звільнений.

Методи wait(), notify(), notifyAll()

Метод wait() використовується для призупинення виконання поточного потоку та звільнення зайнятих ним ресурсів до тих пір, поки інший потік не викличе метод notify() або notifyAll() для того ж монітора об'єкта.

Методи notify() та notifyAll() використовуються для відновлення виконання одного або всіх потоків, заблокованих на моніторі об'єкта.

Note
Примітка

Методи wait(), notify() та notifyAll() повинні викликатися всередині синхронізованого блоку, пов'язаного з тим самим монітором об'єкта, що й очікуючий потік, для забезпечення коректної синхронізації.

У наступному розділі ми розглянемо, що може статися, якщо не використовувати синхронізацію.

1. Що робить ключове слово synchronized у Java?

2. Як працює монітор об'єкта у Java?

question mark

Що робить ключове слово synchronized у Java?

Select the correct answer

question mark

Як працює монітор об'єкта у Java?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 4
some-alt