Java并发编程-显示锁

显示锁

Java 5.0增加的新的协调共享对象访问的机制:ReentrantLock。是一个可提供高级功能的工具。

Lock and ReentrantLock

Lock接口

1
2
3
4
5
6
7
8
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
}

内置锁Syncrhonized的局限。

可定时的与可轮询的锁

死锁的处理可以有更多的选择。例如,同时试图获取两个锁,失败时可以在随机时间再重试。

transferMoney的代码例子。两层trylock

trylock带超时参数,可以在超时后发送一条消息给外部。

LockInterruptily

性能

Java 6 之后内置锁和ReentrantLock的性能上差距不大。

公平性

RenetrantLock可以提供非公平的选择。非公平锁可以再某种程度上提高系统吞吐率,但是也有可能会造成优先级低的线程一直被插队饥饿。

在Syncrhonized无法提供需要的高级特性时再去选择ReentrantLock

读写锁

复杂性比独占锁高,所以在被频繁读取的时候有性能优势,其他情况下要稍差。

1
2
3
4
public interface ReadWriteLock {
Lock readLock();
Lock writeLock();
}