java concurrent 之 Lock
java.util.concurrent.locks.Lock是一個(gè)線程同步機(jī)制潜腻,就像同步塊一樣。 然而耳贬,鎖比同步塊更靈活和更復(fù)雜秕岛。
Demo
Lock lock = new ReentrantLock();
lock.lock();
//critical section
lock.unlock();
首先創(chuàng)建一個(gè)鎖。 那么它的lock()方法被調(diào)用折汞。 現(xiàn)在鎖定實(shí)例被鎖定倔幼。 調(diào)用lock()的任何其他線程將被阻塞,直到鎖定鎖的線程調(diào)用unlock()爽待。 最后损同,unlock()被調(diào)用,Lock現(xiàn)在被解鎖鸟款,所以其他線程可以鎖定它膏燃。
鎖和同步塊之間的主要區(qū)別
- 同步塊不能保證有關(guān)等待進(jìn)入線程的線程被授予訪問權(quán)限的順序。
- 您不能將任何參數(shù)傳遞給同步塊的條目欠雌。 因此蹄梢,嘗試訪問同步塊的超時(shí)是不可能的。
- 同步塊必須完全包含在單個(gè)方法中富俄。 Lock可以在單獨(dú)的方法中調(diào)用lock()和unlock()禁炒。
方法列表
lock()
lockInterruptibly()
tryLock()
tryLock(long timeout, TimeUnit timeUnit)
unlock()
如果可能,lock()方法鎖定Lock實(shí)例霍比。 如果鎖定實(shí)例已被鎖定幕袱,線程調(diào)用lock()將被鎖定,直到鎖定解除鎖定悠瞬。
lockInterruptibly()方法鎖定们豌,除非調(diào)用該方法的線程已被中斷。 另外浅妆,如果一個(gè)線程被阻塞等待鎖定通過這個(gè)方法望迎,并且它被中斷,它退出這個(gè)方法調(diào)用凌外。
tryLock()方法會(huì)嘗試立即鎖定Lock實(shí)例辩尊。 如果鎖定成功,則返回true康辑,如果Lock已鎖定摄欲,則返回false轿亮。 這種方法從不阻止。
tryLock(long timeout胸墙,TimeUnit timeUnit)類似于tryLock()方法我注,除了在放棄嘗試鎖定鎖之前等待給定的超時(shí)時(shí)間。
unlock()方法解鎖Lock實(shí)例迟隅。 通常但骨,Lock實(shí)現(xiàn)只允許鎖定Lock的線程調(diào)用此方法。 調(diào)用此方法的其他線程可能會(huì)導(dǎo)致未檢查的異常(RuntimeException)玻淑。