ReentrantLock 重入锁

一、Lock接口:

  在Java SE 5之后,并发包中新增了Lock接口及相关实现类来实现锁功能。

 Lock接口和synchronized关键字实现锁的区别:

(1)Lock接口需要显示的获取和释放锁,sychronized是隐式的获取和释放锁。也正因为如此,使得Lock接口拥有了锁获取与释放的可操作性、可中断的获取锁、超时获取锁 等多种synchronized关键字所不具备的同步特性。

例如:一个场景,先获取锁A,然后获取锁B,当B获得后,同时释放A,同时获取锁C。以此类推。这种场景synchronized就不好实现了。

(2)尝试非阻塞的获取锁:当前线程尝试获取锁,若这一时刻没有其他线程获取到该锁,则成功获取并持有锁。

(3)能被中断的获取:获取到锁的线程能够 响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。

(4)超时获取锁:在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回。

Lock lock = new ReentrantLock();
lock.lock;
try{
}finally{
    lock.unlock();  
}

2、Lock接口常用API

二、ReentrantLock重入锁

1、ReentrantLock:支持重进入的锁,即:能够支持一个线程对资源的重复加锁。此外该锁还支持获取锁时的公平和非公平性选择,默认是非公平锁。

  ReentrantLock在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁,而不被阻塞。

扫描二维码关注公众号,回复: 8518587 查看本文章

补充:

锁的公平性:公平性是针对获取锁而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,就是FIFO。

  非公平锁可能使线程“饥饿”,而公平锁需要进行大量的线程切换

2、实现机制:

猜你喜欢

转载自www.cnblogs.com/guoyu1/p/12179423.html