Lock

Lock是一个接口,在Lock中声明了五个方法。lock()lock()方法是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取,则进行等待。

tryLock()

tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。

tryLock(longtime, TimeUnit unit)

tryLock(longtime, TimeUnit unit)方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false。如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。

lockInterruptibly()

lockInterruptibly()方法比较特殊,这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。也就使说,当两个线程同时通过lock.lockInterruptibly()

想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。

单独调用interrupt()方法不能中断正在运行过程中的线程,只能中断阻塞过程中的线程。因此当通过lockInterruptibly()方法获取某个锁时,如果不能获取到,只有进行等待的情况下,是可以响应中

断的。而用synchronized修饰的话,当一个线程处于等待某个锁的状态,是无法被中断的,只有一直等待下去。

unLock()

unLock()方法是用来释放锁的。

ReentrantLock

ReentrantLock意思是“可重入锁”,是唯一实现了Lock接口的类,并且ReentrantLock提供了更多的方法。

getHoldCount()

查询当前线程保持此锁的次数。

getOwner()

返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回null。

getQueuedThreads()

返回一个 collection,它包含可能正等待获取此锁的线程。

getQueueLength()

返回正等待获取此锁的线程估计数。

getWaitingThreads(Condition condition)

返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。

getWaitQueueLength(Condition condition)

返回等待与此锁相关的给定条件的线程估计数。

hasQueuedThread(Thread thread)

查询给定线程是否正在等待获取此锁。

hasQueuedThreads()

查询是否有些线程正在等待获取此锁。

hasWaiters(Condition condition)

查询是否有些线程正在等待与此锁有关的给定条件。

isFair()

如果此锁的公平设置为true,则返回 true。

isHeldByCurrentThread()

查询当前线程是否保持此锁。

isLocked()

查询此锁是否由任意线程保持。lock()

获取锁。

lockInterruptibly()

如果当前线程未被中断,则获取锁。

newCondition()

返回用来与此 Lock 实例一起使用的 Condition 实例。

toString()

返回标识此锁及其锁定状态的字符串。

tryLock()

仅在调用时锁未被另一个线程保持的情况下,才获取该锁。

tryLock(longtimeout, TimeUnit unit)

如果锁在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁。

unlock()

试图释放此锁。

ReentrantReadWriteLock

ReentrantReadWriteLock读写锁,实现接口ReadWriteLock(),最主要的有两个方法:readLock()和writeLock()用来获取读锁和写锁。

重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想。

WriteLock可以降级为ReadLock,顺序是:先获得WriteLock再获得ReadLock,然后释放WriteLock,这时候线程将保持Readlock的持有。反过来ReadLock想要升级为WriteLock则不可能.

ReadLock可以被多个线程持有并且在作用时排斥任何的WriteLock,而WriteLock则是完全的互斥。这一特性最为重要,因为对于高读取频率而相对较低写入的数据结构,可以提高并发量。

不管是ReadLock还是WriteLock都支持Interrupt,语义与ReentrantLock一致。

WriteLock支持Condition并且与ReentrantLock语义一致,而ReadLock则不能使用Condition,否则抛出UnsupportedOperationException异常。