显示锁
Java 5.0增加的新的协调共享对象访问的机制:ReentrantLock。是一个可提供高级功能的工具。
Lock and ReentrantLock
Lock接口1
2
3
4
5
6
7
8public 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 | public interface ReadWriteLock { |