Определение порядка линеаризации - PullRequest
0 голосов
/ 11 декабря 2010

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

1 голос
/ 11 декабря 2010

Здесь есть только одна блокировка (блокировка для одного конкретного Buffer объекта), поэтому порядок линеаризации - это просто порядок, в котором эта блокировка получена (или разблокирована - это тот же порядок). Блокировка всегда снимается при входе в wait и приобретается при выходе из wait, поэтому в этом контексте вы слышали о порядке освобождения wait.

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

...