Определение порядка линеаризации
Как именно определяется порядок линеаризации? Как можно сказать, что порядок линеаризации следующего кода является порядком, в котором выпущен wait(). Как проверить, является ли код линеаризуемым?
class Buffer
{
int in = 0;
int out = 0;
int numElems = 0;
synchronized void put(E elem) throws InterruptedException
{
while (!numElems < N)
{
wait();
}
buff[in] = elem;
in = (in + 1) % N;
notifyAll();
}
synchronized E take() throws InterruptedException
{
while (!numElems > 0)
{
wait();
}
E temp = buff[out];
out = (out + 1) % N;
return temp;
notifyAll();
}
}
1 ответ
Здесь только один замок (замок на одном конкретном Buffer
объект), поэтому порядок линеаризации - это просто порядок, в котором эта блокировка приобретается (или освобождается - это тот же порядок). Блокировка всегда снимается при входе в wait
и приобрел на выходе из wait
вот почему вы слышали о wait
освободить заказ в этом контексте.
Я не уверен, что вы подразумеваете под "проверить, что он линеаризуем". Если под этим вы подразумеваете, что любое параллельное выполнение эквивалентно некоторому последовательному упорядочению, то здесь это довольно очевидно (хотя в общем и целом сложно), потому что все обращения к памяти находятся под одной блокировкой, поэтому параллельное выполнение фактически отсутствует.