0

線形化の順序はどの程度正確に決定されますか。次のコードの線形化の順序は、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();
    }
}
4

1 に答える 1

1

ここにはロックが1つしかない(1つの特定のBufferオブジェクトのロック)ので、線形化の順序は、そのロックが取得される(または解放される-同じ順序です)順序です。ロックは、への入り口で常に解放されwait、出口で取得されます。そのため、このコンテキストでの解放順序waitについて聞いたことがあります。wait

「線形化可能であることを確認する」とはどういう意味かわかりません。つまり、並列実行がシリアル順序付けと同等であることを意味する場合、メモリへのすべてのアクセスは単一のロックの下にあるため、ここでは非常に明白です(一般的には難しいですが)。したがって、実質的に並列実行はありません。

于 2010-12-11T05:12:32.863 に答える