tryLock():允许在一定的时间内来获取锁,获取失败则返回false,这样线程可以执行其它的操作,而不至于使线程进入休眠(synchronized获取失败则进入阻塞队列中等待)。
ReentrantReadWriteLock:提供了读锁和写锁,允许多个线程获得读锁、而只能有一个线程获得写锁。
锁的获取和释放可以在不同的代码块、不同的方法中。且当获取了多个锁时,允许以任何顺序获取和释放多个锁。
获取 |
void |
lock() |
获取锁。如果锁已被其他线程获取,则进行等待。 |
发生异常时,不会自动释放锁,需在finally中去释放锁 |
|||
void |
扫描二维码关注公众号,回复:
4559419 查看本文章
|
+ 等待获取锁的过程,可被B.interrupt()中断 |
|
发生异常时,不会自动释放锁,需在finally中去释放锁 |
|||
boolean |
tryLock() |
在给定时间内获取锁,获取失败则返回false |
|
发生异常时,不会自动释放锁,需在finally中去释放锁 |
|||
释放 |
void |
unlock() |
释放锁,通常在finally中释放。 |
必须在获取锁成功的情况下才能释放,IllegalMonitorStateException |
|||
其他 |
返回绑定到此 Lock 实例的新 Condition 实例。 |
条件队列,相当于synchronized(obj)中的对象监视器obj。但是synchronized只能提供一个对象锁。而Lock.newCondition(),可以获取对应锁上的多个条件队列。
await():造成当前线程在接到信号或被中断之前一直处于等待状态。
await(long time, TimeUnit unit):成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
signal():唤醒一个等待线程。
signalAll():唤醒所有等待线程。
ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。
Lock:readLock():返回用于读取操作的锁。
Lock:writeLock() :返回用于写入操作的锁。
- 执行结果
写写,写读相互独立。读读可并行
Lock lock = new ReentrantLock(); 默认为非公平锁
Lock lock = new ReentrantLock(true); 非公平锁
公平锁模式下,一般而言,等待时间最久的线程(最先请求的线程)会获得该锁。而在非公平锁例下,则无法保证锁的获取是按照请求锁的顺序进行的。
lock锁是不是公平锁:lock.isFair()
当前线程获取到lock锁的次数:lock.getHoldCount()
等待获取lock锁的线程个数:lock.getQueueLength()
线程t是否在等待获取锁lock:lock.hasQueuedThread(t)
是否有线程在等待获取锁lock:lock.hasQueuedThreads()
当前线程是否持有锁lock:lock.isHeldByCurrentThread()
锁lock是不是被任意线程持有中:lock.isLocked()
- 生产者线程
- 消费者线程