synchronized (lockObj) {
...
}
vs
lock.lock();
try {
...
} finally {
lock.unlock();
}
使用ReentrantLock获取锁和释放锁可以不在同一个地方,而synchronized无论是方法还是代码块都只能是在一个方法中获一个代码块中,比如
1private ReentrantLock lock;
2
3public void foo() {
4 ...
5 lock.lock();
6 ...
7}
8
9public void bar() {
10 ...
11 lock.unlock();
12 ...
13}
ReentrantLock提供的接口更加丰富,它支持tryLock()
和tryLock(long, TimeUnit)
来尝试获取锁,以及lockInterruptibly()
可中断获取锁,还可以指定获取锁的策略,公平锁或非公平锁。ReentrantLock可以获取当前锁的信息,比如当前占有锁的线程以及等待锁的线程队列等。这些都是使用synchronized无法实现的。ReentrantLock的用法可以参考ReentrantLock使用介绍。
但是synchronized的优势也很明显,就是使用非常简单,只需要一个关键字修饰即可实现一个线程安全的方法或者代码块。
内容