线性化顺序的确定

时间:2010-12-11 04:28:43

标签: java multithreading linearization

确定线性化顺序究竟如何。怎么说以下代码的线性化顺序是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 个答案:

答案 0 :(得分:1)

这里只有一个锁(锁定在一个特定的Buffer对象上),因此线性化顺序就是获取(或释放 - 锁定顺序相同)的顺序。锁定始终在wait的导入时释放,并在退出wait时获取,这就是您在此上下文中听说过wait发布顺序的原因。

我不确定你的意思是“检查它是否可以线性化”。如果你的意思是任何并行执行都等同于某些串行排序,那么这里很明显(虽然通常很难),因为对内存的所有访问都在一个锁下,所以实际上没有并行执行。