在 JDK 5.0 的早期版本中,重入锁的性能远远好于 synchronized,但从 JDK 6.0 开始,JDK 在 synchronized 上做了大量的优化,使得两者的性能差距不大。
例子:
package lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReenterLock implements Runnable {
public static ReentrantLock lock = new ReentrantLock();
public static int i = 0;
public void run() {
for (int j = 0; j < 1000 * 10000; j++) {
lock.lock();
lock.lock();
try {
i ++;
} finally {
lock.unlock();
lock.unlock();
}
}
}
public static void main(String[] args) throws InterruptedException {
ReenterLock r1 = new ReenterLock();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r1);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(i);
}
}
- 重入锁有着显示的操作过程。开发人员必须手动指定何时加锁,何时释放锁。正因为这样,重入锁对逻辑控制的灵活性要远远好于 synchronized。
- 重入锁允许一个线程连续多次获得同一把锁,如果不允许的话,同一个线程第二次获得锁时,将会和自己产生死锁。
- 如果同个线程多次获得锁,那么在释放锁时,也必须释放相同次数。