Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpSySm 199 of 322 menu
◀ ▶

Синхронизированный метод в Java

Ключевое слово synchronized перед методом экземпляра берет монитор этого объекта. Пока один поток выполняет такой метод, остальные ждут на входе в любой synchronized метод того же экземпляра.

У статического synchronized метода монитор принадлежит классу, а не отдельному объекту. Статические и обычные мониторы не мешают друг другу, если данные действительно разделены.

Счетчик с защищенным приращением:

class SafeTally { private int value = 0; synchronized void bump() { value++; } synchronized int getValue() { return value; } }

Два потока по тысяче вызовов bump после ожидания дают ровно 2000:

public class Main { public static void main(String[] args) throws InterruptedException { SafeTally tally = new SafeTally(); Runnable work = () -> { for (int i = 0; i < 1000; i++) { tally.bump(); } }; Thread left = new Thread(work); Thread right = new Thread(work); left.start(); right.start(); left.join(); right.join(); System.out.println(tally.getValue()); } }

Синхронизированный метод держит монитор на всё время выполнения. Если внутри долгая работа без доступа к общим полям, лучше сузить участок блоком, который разберем отдельно.

Класс Wallet с полем coins. Методы deposit и balance сделайте synchronized. Два потока по 300 депозитов, затем вывод баланса.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить