Охраняемая приостановка (синхронизация)

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Шаблон:Шаблон проектирования Охраняемая приостановка (англ. guarded suspension) — это шаблон проектирования в параллельном программировании для управления операциями, которые для начала своего выполнения требуют как получения блокировки, так и удовлетворения заданным предварительным условиям.

Охраняемая приостановка — общепринятая идиома для координации работы потоков.

Пример на Java[править]

В следующем примере показан обмен сообщениями между двумя потоками с использованием шаблона охраняемая приостановка:

<source lang="java">

public class Drop {

   // Сообщение, которое будет передано
   // от потока-источника потоку-приёмнику.
   private String message;
   // True если поток-приёмник должен дождаться пока поток-источник
   // оставит сообщение, или false если поток-источник должен дождаться
   // пока поток-приёмник заберёт ранее оставленное (потоком-источником)
   // сообщение.
   private boolean empty = true;
   public synchronized String take() {
       // Ожидаем, пока сообщение станет доступным.
       while (empty) {
           try {
               wait();
           } catch (InterruptedException e) {}
       }
       // Переключаем статус.
       empty = true;
       // Уведомляем поток-источник, о том
       // что статус был изменён.
       notifyAll();
       return message;
   }
   public synchronized void put(String message) {
       // Ожидаем, пока поток-приёмник не заберёт
       // предыдущее сообщение.
       while (!empty) {
           try { 
               wait();
           } catch (InterruptedException e) {}
       }
       // Сохраняем сообщение.
       this.message = message;
       // Переключаем статус.
       empty = false;
       // Уведомляем поток-приёмник, о том
       // что статус был изменён.
       notifyAll();
   }

}

</source>

Литература[править]

  • Lea Doug Concurrent Programming in Java Second Edition. — Addison-Wesley, 2000. — ISBN 0-201-31009-0.

Ссылки[править]

  • Guarded Blocks, Concurrency, The Java™ Tutorials [1]