确定线性化顺序究竟如何。怎么说以下代码的线性化顺序是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();
}
}
答案 0 :(得分:1)
这里只有一个锁(锁定在一个特定的Buffer
对象上),因此线性化顺序就是获取(或释放 - 锁定顺序相同)的顺序。锁定始终在wait
的导入时释放,并在退出wait
时获取,这就是您在此上下文中听说过wait
发布顺序的原因。
我不确定你的意思是“检查它是否可以线性化”。如果你的意思是任何并行执行都等同于某些串行排序,那么这里很明显(虽然通常很难),因为对内存的所有访问都在一个锁下,所以实际上没有并行执行。