Синхронизация конкуренции
private int [100] buf;
public synchronized void append(int element) { . . . } public synchronized int take() { . . . }
} Оба метода, определенных в классе Buffer, являются синхронизированными, что предотвращает их взаимное влияние во время работы с одним и тем же объектом, даже если они вызываются разными потоками. Объект, в котором все методы синхронизированы, по сути, является монитором. В общем случае объект может содержать и синхронизированные, и несинхронизированные методы. Несинхронизированный метод может запускаться в объекте в любое время, даже параллельно выполнению синхронизированного метода. В некоторых случаях количество операторов для обработки разделяемых данных существенно меньше общего числа операторов в теле метода. В подобной ситуации целесообразно синхронизировать лишь фрагмент тела, а не весь метод. Такая конструкция называется синхронизированным оператором: synchronized (выражение){ операторы } где выражение должно вычислять объект, а оператор может быть как простым, так и составным. На время выполнения этого оператора или операторов объект |
606 |
Глава 19. Основные понятия параллельного программирования |
блокируется. Таким образом, оператор или операторы выполняются точно так же, как если бы они были телом синхронизированного метода. Объект, для которого определены синхронизированные методы, должен иметь связанную с ним очередь, хранящую запросы синхронизированных методов, приходящиеся на тот период, когда объект был блокирован. Такую структуру называют очередью внутреннего состояния. Она имеется у любого объекта и обслуживается неявно. При разблокировании объекта запрос на метод, находящийся в очереди внутреннего состояния, помещается в очередь задач, готовых к выполнению. |