Синхронизированный метод в 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 депозитов, затем вывод
баланса.