java并发之重入锁

<1>ReentrantLock lock=new ReentrantLock();

  //获得锁    lock.lock();        //释放锁    lock.unlock();

<2>一个线程可以连续两次获得同一把锁,但是在释放锁的时候必须释放相同的次数,

释放的次数多,会报java.lang.IllegalMonitorStateException异常;如果释放的次数少,

相当于该线程仍然持有该锁,其它线程则无法进入临界区

<3>锁申请等待限时:lock.tryLock(5,TimeUtil.SECONDS);

5秒申请成功,返回true;否则返回false

也可以不带参数执行,申请锁成功,立即返回true,否则返回false

<4>中断响应:

对于synchronized来说,如果一个线程在等待锁,只有两种情况:

获得锁继续执行或者继续等待;对于重入锁来说:还可以响应中断。

即在申请锁的过程中,被中断,可放弃对锁的申请,预防死锁

<5>公平锁:

对于synchronized来说,锁是非公平的;重入锁允许我们进行锁的公平性设置

new ReentrantLock(true);

重入锁的实现,主要包含三个方面:

<1>是原子状态,原子状态使用cas操作来存储当前锁的状态,判断锁是否被别的线程持有
<2>是等待队列:所有没有请求到锁的线程,会进入等待队列进行等待,待有线程释放锁后,就能从等待队列中唤醒一个线程,继续工作

<3>是阻塞原语,用来挂起和恢复线程

Condition对象:

<1>构造:lock.newCondition();会生成一个与当前重入锁绑定的condition对象

<2>方法:await:使当前线程等待,同时释放当前锁,当其他线程使用signal或signall方法时,线程会继续获得锁并继续执行,或者当线程中断时,也能跳出等待

             signal:唤醒一个在等待中的线程; signall:唤醒等待中的所有线程

             awaitUninterrucptily:并不会在等待过程中响应中断

 

转载于:https://www.cnblogs.com/meisp/p/7009250.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值