Технологии 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--;
// Передача эстафеты