持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
newCondition()方法
关键字 synchronized 与 wait()/notify()这两个方法一起使用可以实现等待/通知模式. Lock 锁的 newContition()方法返回 Condition 对象,Condition 类也可以实现等待/通知模式.
使用 notify()通知时, JVM 会随机唤醒某个等待的线程. 使用 Condition 类可以进行选择性通知. Condition 比较常用的两个方法:
await()会使当前线程等待,同时会释放锁, 当其他线程调用 signal() 时,线程会重新获得锁并继续执行. signal()用于唤醒一个等待的线程
注意: 在调用 Condition 的 await()/signal()方法前,也需要线程持有相关的 Lock 锁. 调用 await()后线程会释放这个锁,在 singal()调用后会从当前 Condition 对象的等待队列中,唤醒 一个线程,唤醒的线程尝试获得锁, 一旦获得锁成功就继续执行
公平锁与非公平锁
大多数情况下,锁的申请都是非公平的. 如果线程1与线程2都在请求锁 A, 当锁 A 可用时, 系统只是会从阻塞队列中随机的选择一个线程, 不能保证其公平性 公平的锁会按照时间先后顺序,保证先到先得, 公平锁的这一特点不会出现线程饥饿现象. synchronized 内部锁就是非公平的. ReentrantLock 重入锁提供了一个构造方法**:ReentrantLock(boolean fair)** ,当在创建锁对象时实参传递 true 可以把该锁设置为公平锁. 公平锁看起来很公平,但是要实现公平锁必须要求系统维护一个有序队列,公平锁的实现成本较高,性能也低. 因此默认情况下锁是非公平的. 不是特别的需求,一般不使用公 平锁.
几个常用的方法
- int getHoldCount() 返回当前线程调用 lock()方法的次数
- int getQueueLength() 返回正等待获得锁的线程预估数
- int getWaitQueueLength(Condition condition) 返回与 Condition 条件相关的等待的线程预估数
- boolean hasQueuedThread(Thread thread) 查询参数指定的线程是否在等待获得锁
- boolean hasQueuedThreads() 查询是否还有线程在等待获得该锁
- boolean hasWaiters(Condition condition) 查询是否有线程正在等待 指定的 Condition 条件
- boolean isFair() 判断是否为公平锁
- boolean isHeldByCurrentThread() 判断当前线程是否持有该锁
- boolean isLocked() 查询当前锁是否被线程持有;