ReentrantLock 中 Mutex 的lock()和trylock()方法的區別
阿新 • • 發佈:2018-12-15
lock()與trylock()的實現如下:
lock是通過同步器的模板方法acquire實現的
trylock是自定義的過載方法tryAcquire()
示例實現如下:
lock函式和tryLock函式都是用於鎖定物件,但他們之間有一定的區別:
lock函式是阻塞的,(因為它呼叫WaitForSingleObject函式時傳遞的第二個引數是INFINITE,表示無限等待下去,所以是阻塞的?)。
tryLock函式時非阻塞的,呼叫後立即返回。因為它呼叫WaitForSingleObject函式時傳遞的第二個引數是0,表示不等待,立即返回。
lock()方法是一個無條件的鎖,與synchronize意思差不多,但是另一個方法 tryLock()方法只有在成功獲取了鎖的情況下才會返回true,如果別的執行緒當前正持有鎖,則會立即返回false!如果為這個方法加上timeout引數,則會在等待timeout的時間才會返回false或者在獲取到鎖的時候返回true。 (原文:https://blog.csdn.net/Lanal11/article/details/79922058?utm_source=copy ) 其中加上timeout引數的trylock()是通過tryAcquireNanos來實現的
呼叫lock或者tryLock後,都需要呼叫unlock來解鎖。