在Java中的Lock介面有lock、tryLock和lockInterruptibly三個功能很相近的method,看完javadoc後還是搞不太清楚它們之間的差異性,終於找到一篇解釋清楚的文章了。
- lock():若lock被thread A取得,thread B會進入block狀態,直到取得lock。
- tryLock():若當下不能取得lock,thread就會放棄。
- lockInterruptibly():跟lock()情況一下,但是thread B可以透過interrupt被喚醒處理InterruptedException。
範例:
- lock():
1 | import java.util.Date; |
可以發現ThreadB呈現block狀態,一直在等待Thread A釋放lock。
- tryLock():
1 | import java.util.Date; |
若一開始lock被Thread A取得,Thread B透過tryLock()當下若沒有取得到lock,就會放棄。
- lockInterruptibly():
1 | import java.util.Date; |
Thread A先取得lock,Thread B無法取得lock進入block狀態,可以透過發出interrupt方式喚醒Thread B。
Lock和synchronized幾乎是大同小異,但是Lock可以做更細微的同步方式。