0%

Lock

Lock

由于synchronized在很多情况下是不可控的,所以在jdk5出现了一个新的加锁方式Lock,提供了无条件的,可轮询的,可定时的,可中断的所获取操作,所有加锁和解锁都是显式的

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface Lock {
void lock();

void lockInterruptibly() throws InterruptedException;

boolean tryLock();

boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

void unlock();

Condition newCondition();
}

ReentrantLock

ReentrantLock为Lock的实现类,实现了标准的互斥锁,使用CAS,比synchronized效率略高,一次最多只有一个线程持有ReentrantLock —> 有公平锁和非公平锁,是可重入锁,每次重入会把拥有数++

非公平是指每个线程在进来时就尝试一次

内部使用LockSupport的park和unpark方法来进行线程的通信

state状态 0.未占用 1.已占用 大于1 重入 使用CAS来修改state状态

ReadWriteLock

ReadWriteLock读写锁暴露了两个Lock,一个用来读,一个用来写。加锁策略是允许多个读者同时读,但是只能有一个写者,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥

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

Lock writeLock();
}

ReentrantReadWriteLock为ReadWriteLock的实现类

与synchronized比较

  • Lock使用代码实现CAS;synchronized通过jvm的monitor实现的
  • 使用ReentrantLock可以设置尝试获取锁的等待时间,超过该时间则中断等待