1 特点
- 可中断
- 可以设置超时时间
- 可以设置为公平锁
- 支持多个条件变量
2 基本语法
ReentrantLock lock = new ReentrantLock();
// 获取锁
lock.lock();
try {
// 临界区
} finally {
// 释放锁
lock.unlock();
}
3 可重入
static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
lock.lock();
try {
log.info("main...");
method1();
} finally {
lock.unlock();
}
}
static void method1() {
lock.lock();
try {
log.info("method1...");
method2();
} finally {
lock.unlock();
}
}
static void method2() {
lock.lock();
try {
log.info("method2...");
} finally {
lock.unlock();
}
}
3 可打断
static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
try {
// 如果没有竞争 此方法会获取lock锁
// 如果有竞争 就进入阻塞队列 可以被其他线程用interrupt打断
log.info("t1 start get lock..");
lock.lockInterruptibly();
} catch (InterruptedException e) {
log.info("t1 dont get lock..");
e.printStackTrace();
return;
}
try {
log.info("t1 get lock..");
} finally {
lock.unlock();
}
}, "t1");
lock.lock();
t1.start();
TimeUnit.SECONDS.sleep(1);
t1.interrupt();
}
4 锁超时
static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
log.info("t1 start get lock..");
if (!lock.tryLock()) {
log.info("t1 dont get lock..");
return;
}
// try {
// if (!lock.tryLock(1, TimeUnit.SECONDS)) {
// log.info("t1 dont get lock..");
// return;
// }
// } catch (InterruptedException e) {
// log.info("t1 dont get lock..");
// e.printStackTrace();
// return;
// }
try {
log.info("t1 get lock..");
} finally {
lock.unlock();
}
});
lock.lock();
t1.start();
}
5 公平锁
锁的竞争不再是随意的了,相对来说就是公平的(先到先得)
6 条件变量
Condition condition = lock.newCondition();
condition.await();
condition.signal();
condition.signalAll();