一、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()方法获取锁,而不被阻塞。
补充:
锁的公平性:公平性是针对获取锁而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,就是FIFO。
非公平锁可能使线程“饥饿”,而公平锁需要进行大量的线程切换
2、实现机制:
原文地址:https://www.cnblogs.com/guoyu1/p/12179423.html
时间: 2024-11-03 01:26:39