reentrantlock公平锁
(1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantLock也是独占锁,加锁和解锁的过程需要手动进行,不易操作,但非常灵活。
(2)synchronized可重入,因为加锁和解锁自动进行,不必担心最后是否释放锁;ReentrantLock也可重入,但加锁和解锁需要手动进行,且次数需一样,否则其他线程无法获得锁。
(3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以相应中断。
ReentrantLock公平锁,等待时间最长的线程先运行
首先做一个简易的售票功能
如下使用了reentrantlock公平锁,结果为
public class T1 {
static int num = 23;
static ReentrantLock lock = new ReentrantLock(true);
public static void main(String[] args) {
new Thread(T1::tt, "文化路").start();
new Thread(T1::tt, "瑞达路").start();
new Thread(T1::tt, "红旗路").start();
}
static void tt() {
String na = Thread.currentThread().getName();
while (num > 1) {
lock.lock();
num--;
System.out.printf("%s:%d%n", na, num);
if (num < 1) {
break;
}
lock.unlock();
}
}
}
转载自:
ReentrantLock的使用