公平锁与非公平锁ReentrantLock

公平锁与非公平锁

        大多数情况下,锁的申请都是非公的,当线程1与线程2都在请求锁A,当锁A可用时,系统只会从阻塞队列中随机选择一个线程,不能保证其公平性。

        非公平锁,系统会倾向于让一个线程再次获得已经持有的锁,这种分配策略是高效的但非公平

        公平锁会按照时间先后顺序保证先到先得,公平锁的这一特点不会让线程饥饿(排队的多了,可能调度器一直没有选中你),看起来很公平,但是要实现公平锁,必须要求系统维护一个有序队列,因此实现成本高,性能低,因此默认情况下默认锁是非公平,不是特别的需求,一般不使用公平锁

        多个线程不会发生同一个线程连续多次获得锁的可能,保证了锁的公平性

synchronized内部锁就是非公平的。ReentrantLock重入(具有可重入性)锁提供了一个构造方法,有参为公平锁,无参为非公平锁

        ReentrantLock(Boolean fair);当创建锁对象时,实参传递true可以将该锁设置为公平锁

        ReentrantLock   lock = new ReentrantLock();    //非公平

        ReentrantLock   lock = new ReentrantLock(true); //公平

        lock.lock();//获得锁

        lock.unlock();//释放锁

        lock.lockInterruptibly();//如果当前线程未被中断则获得锁, 如果当前线程被中断则出现异常

        lock.tryLock(long time, TimeUnit unit);//在给定等待时长内锁没有 被另外的线程持有,并且当前线程也没有被中断,则获得该锁.通过该 方法可以实现锁对象的限时等待.

       Condition condition = lock.newCondition();//使用 Condition 类可以进行选择性通知.

condition .await()用于等待

condition .signal()用于唤醒一个等待的线程   signalAll()  用于唤醒所有等待的线程

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() 查询当前锁是否被线程持有;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值