2010-12-11 74 views
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(); 
    } 
} 
+0

是預期的格式?很難閱讀。 – 2010-12-11 04:30:45

+0

已將代碼格式化。 – devnull 2010-12-11 04:35:58

回答

1

這裏有只有一個鎖(在一個特定Buffer對象的鎖),所以爲了線性化僅僅是在該鎖被獲取(或釋放 - 這是相同的順序)的。鎖定總是在輸入wait時釋放,並在從wait退出時獲取,這就是爲什麼您在此上下文中已經聽到wait發行順序的原因。

我不確定您的意思是「檢查它是否線性化」。如果你的意思是說任何並行執行都等同於某個串行順序,那麼這裏就很明顯了(儘管通常很困難),因爲所有對內存的訪問都在一個鎖內,所以實際上並沒有並行執行。