Page 188 - 6571
P. 188
використати. У даному випадку доведеться написати набагато
менше коду, а отже, допустити менше помилок.
3. Об’єкти типу Lock / Condition необхідно
використовувати тільки у тому випадку, якщо дійсно потрібні
додаткові механізми керування процесом синхронізації.
Як було згадано раніше, у кожного об’єкта в мові Java є
власне вбудоване блокування. Потік може захопити дане
блокування, викликавши синхронізований метод. Проте, існують
й інший механізм захоплення блокування, що полягають у
входженні в синхронізований блок.
Припустимо, що необхідно синхронізувати доступ до
об’єктів класів, які не були призначені для багатопотокового
доступу. Тобто клас не визначає синхронізованих методів. Більше
того, клас був написаний стороннім розробником і у нас немає
доступу до його вихідного коду. Отже, додати слово
synchronized до оголошення відповідних методів класу не
можливо. Проте, існує досить просте рішення даної проблеми, що
полягає у виклику методів такого класу в блоці позначеного
ключовим словом synchronized.
Коли потік входить у блок позначений словом
synchronized, то він захоплює блокування об’єкта obj.
synchronized (obj) { // синтаксис синхронізованого блоку
критична секція коду;
}
Іноді в коді зустрічаються спеціальні блокування схожі до
наступного:
public class Bank {
private double[] accounts;
private Object lock = new Object();
...
public void transfer(int from, int to, int amount) {
synchronized (lock) { // спеціальне блокування
accounts[from] = accounts[from] - amount;
accounts[to] = accounts[to] + amount;
}
System.out.println();
}
}
187