ReentrantLock实现机制

ReentrantLock实现机制

  • 公平锁和非公平锁
    1.公平锁的实现就是谁等待的时间长谁就先获取锁
    2.非公平锁就是随机获取锁,谁运气好,cpu时间片轮询到哪个线程,哪个线程就能获取资源
    3.公平锁在市里化对象时要写入参数"true"
    4.非公平锁在实例化对象时不用写入参数,因为默认为非公平锁
  • 可重入锁和不可重入锁
    所谓不可重入锁就是当前线程执行某个方法已知获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞,可重入锁恰好与之相反,不会被阻塞。
    Reentrant Lock时可重入锁
    Synchornized也是可重入锁
  • 线程同步
    1.Synchornized
    体现了多线程的有序性和可见性,加锁和解锁时是隐式的,修饰方法/代码块
    2.Java内置关于CAS的类——Atomicxxx类
    体现了多线程的原子性
    3.Reentrant Lock
    提供了无条件的、可轮询的、定时的以及可中断的锁获取操作,加锁和解锁都是显式的
    Reentrant Lock实现了Lock接口
  • Lock中的基础方法
void lock();

获取一个锁进行加锁操作
2.

void lockInterruptibly() throws InterryptedException;

Interruptibly意思是可中断的,该方法获取锁就是可中断
eg:

thread A acquired lock //线程A获取到锁
thread B wait //线程B获取不到,就在等待获取,处于阻塞状态
thread B interrupt() //响应中断—即B中断,处于等待获取锁的状态,直接抛出Interrupted Exception异常
3.

boolean trylock();

体现了可轮询性
该方法获取锁:只有在该锁被调用期间处于空闲状态,才能获取到
如果获取到该锁是可用的,则立刻返回一个值,即true
如果获取到锁是不可用的,则立刻赶回一个值,即false
如果为获取的化,也不会阻塞,抗译先进行别的事情,可以有一个while条件,不停地(可轮询的)去判断该把锁,获取到,则进行该锁索进行的事情;未获取到,进行其他事情,再判断
4.

boolean trylock(long time,TimeUnit unit)throws InterruptedException

未获取到,会等待一段时间,即阻塞一会而儿,但超时之后,还未获取,就先执行其他的,若阻塞(等待)期间获取到,则直接返回false
其他情况与上一个方法相同
5.

void unlock();

用来释放锁
6.

Condition newCondition();

condition意思为条件,该方法返回一个condition对象
设置获取锁的一个条件,满足该条件才能获取锁(Synchronized没有)

  • Reentrant Lock的使用格式
Lock lock = new ReentrantLock();//实例化一个对象
try{
     lock.lock();//加锁操作
     }
     finally{
     lock.unlock();//释放锁
              }

注意:lock中没有异常处理,所以不需要catch块
如果忘了释放锁,可能导致内存溢出或者造成死锁

  • 响应中断(常用在死锁里面)
    eg:
    A:r1—>r2
    B:r2—>r1
    造成交叉锁(死锁常见问题的体一种),就会陷入死锁,但A.interrupt();会中断A,释放r1.则B获取到r1,就不会造成死锁
  • 可定时(超时时间)
tryLock(long time,TimeUnit uint);

使用Reentrant Lock实现线程安全的单例,返回唯一一个实例

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值