Определение порядка линеаризации

Как именно определяется порядок линеаризации? Как можно сказать, что порядок линеаризации следующего кода является порядком, в котором выпущен 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 освободить заказ в этом контексте.

Я не уверен, что вы подразумеваете под "проверить, что он линеаризуем". Если под этим вы подразумеваете, что любое параллельное выполнение эквивалентно некоторому последовательному упорядочению, то здесь это довольно очевидно (хотя в общем и целом сложно), потому что все обращения к памяти находятся под одной блокировкой, поэтому параллельное выполнение фактически отсутствует.

Другие вопросы по тегам