Технологии Java
Задачи и средства многопоточного программирования
do { oldV = v.get(); newV = process(old); } while (!v.compareAndSet(oldV, newV));
// Получение доступа к ресурсу while (!v.compareAndSet(0, 1)); // Действия с ресурсом // Освобождение ресурса v.set(0);
void set(Object data) throws InterruptedException { lock.lock(); try { while (this.data != null) { notFull.await(); } this.data = data; notEmpty.signal(); } finally { lock.unlock(); } }
l.lock() try { … } finally { l.unlock() }
empty.lock(); // копирование full.unlock();
full.lock(); // копирование empty.unlock();
〈name: statements〉
resource 〈 resource: // Доступ к ресурсу 〉
〈await(!lock) lock = true;〉 // Вход // Критическая секция lock = false; // Выход
while (!lock.compareAndSet(0, 1)); // Вход // Критическая секция lock.set(0); // Выход
do { do { p = permits.get(); } while (p == 0); } while (!permits.compareAndSet(p, p - 1));
do { p = permits.get(); } while (!permits.compareAndSet(p, p + 1));
queue.add(task); queue.notify(); task.wait();
while (queue.isEmpty()) { queue.wait(); } Task t = queue.get(); // Обработка задания t.notify();
〈if (nr++ == 0) busy.lock();〉 // Чтение 〈if (--nr == 0) busy.unlock();〉
busy.lock(); // Запись busy.unlock();
if (nw == 0 && dr > 0) { dr--; // Возобновить процесс-читатель r.unlock(); } else if (nr == 0 && nw == 0 && dw > 0) { dw--; // Возобновить процесс-писатель w.unlock(); } else { e.unlock(); // Открыть вход }
e.lock(); if (nw > 0) { dr++; e.unlock(); r.lock(); } // Доступ разрешен nr++; // Передача эстафеты // Чтение e.lock(); nr--; // Передача эстафеты
e.lock(); if (nw > 0 || nr > 0) { dw++; e.unlock(); w.lock(); } nw++; // Передача эстафеты // Запись e.lock(); nw--; // Передача эстафеты