ReentrantLock 简介
java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为 Lock 的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。
ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似轮询锁、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时间来调度线程,把更多时间用在执行线程上。)
与synchronized比较
相比synchronized,ReentrantLock增加了一些高级功能,主要有一下3项:
- 1、等待可中断:当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待;
- 2、公平锁:多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁。Synchronized锁是非公平的,ReentrantLock默认也是非公平的,但可以使用带布尔值的构造函数要求使用公平锁;
- 3、ReentrantLock锁可以绑定多个条件,即一个ReentrantLock对象可以同时绑定多个Condition对象。
ReentrantLock使用示例
package org.iti.thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadDemo_2 {
public static void main(String[] args) {
final Account account = new Account();
new Thread() {
public void run() {
account.printName("tailyou");
};
}.start();
new Thread() {
public void run() {
account.printName("lixueyang");
};
}.start();
}
}
class Account {
Lock lock = new ReentrantLock();
public void printName(String name) {
lock.lock();
try {
for (int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
lock.unlock();
}
}
}