Java5新增了一种机制ReentrentLock,在此之前只有Synchronized与Volatile;ReentrentLock而是提供了更多功能,适用更复杂场景。
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
}
很灵活,lockInterruptibly在获取锁时可中断,tryLock()可轮询避免死锁,tryLock(long time, TimeUnit unit)可定时,可中断
性能
java6改进了内置锁的算法,Synchronized性能略差于ReentrentLock,但随着对内置锁的不断优化使得其表现要好于ReentrentLock
偏向锁/轻量级锁/重量级锁:这三种锁是指锁的状态,并且是针对Synchronized。在Java 5通过引入锁升级的机制来实现高效Synchronized。这三种锁的状态是通过对象监视器在对象头中的字段来表明的。
偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。
(锁的内部原理}
公平性
ReentrentLock提供公平锁与非公平锁(默认),非公平锁性能高是因为它允许”插队“,带来了高的吞吐量
二者之间选择
Doug Lea大神更推荐Synchronized,使用方便性能好,仅当Synchronized无法满足你的需求时,再考虑ReentrentLock
参考书籍
《Java并发编程实战》