2014-03-06 65 views
3

我有一個關於這行代碼的問題:多線程:顯式鎖

class S1Es3SharedState { 
    //lock 
    private final Lock lock = new ReentrantLock(); 
    private int x = 0; 

    public int getX() { 
     lock.lock(); 
     try { 
      return x; 
     } finally { 
      lock.unlock(); 
     } 
    } 

    public void incrementX() { 
     lock.lock(); 
     try { 
      this.x = x++; 
     } finally { 
      lock.unlock(); 
     } 
    } 
} 

相同的對象鎖定在statments方法的getX和方法incrementX
是什麼意思?
如果我明白這意味着同一個對象用於鎖定兩個方法的陳述,那麼如果兩個方法都是免費的,則線程可以輸入這些方法之一,對嗎?

例如:
ThreadA中處於的getX方法內,現在有一個上下文切換所以ThreadA中正在等待(在方法內)和ThreadB正在運行,並且想要在的getX(進入)方法,但它不能因爲已經有了ThreadA。另外如果ThreadB需要輸入增量X方法仍然不能,因爲ThreadA在getX方法中。所以我使用的鎖對象允許在兩個方法都是空閒的情況下(沒有正在運行的線程)輸入一個線程。有可能的?發生這種情況是因爲我使用相同的對象來鎖定getX和incrementX方法。

+0

只是一個方面的評論,沒有什麼與你的問題有關......你知道'this.x = x ++'比'x ++'更加冗長和奇怪嗎? – morgano

+0

是的,但我做了與日食(以自動方式)非常快只是爲了舉一個例子,在每一種情況下,我知道:) –

回答

2

這意味着兩個不同的線程T1和T2不能得到
並且在同一時刻遞增該變量。

簡而言之return x;this.x = x++;不能由兩個不同的線程T1和T2同時執行
。線程
哪些進入第一個勝,只有當它完成並打電話解鎖,
第二個將有機會自己獲得鎖自己
並完成他的工作。

+0

謝謝,在一種方式像紅綠燈時,當輸入T1或T2在這2方法......這種交通燈是紅色的,當兩種方法都是免費的時候它們都是綠色的,這是正確的?這個紅綠燈控制2條街道(方法),並且當兩條街道都空閒時燈光是綠色的。我能以這種方式想象嗎? –

+0

是的,我覺得這是一個很好的比喻。鎖對象只是一個,鎖對象是交通燈。方法是兩條街道。 –

+0

非常感謝你 –