#

Java 并发 API 对『』提供了支持。锁是一些对象,它们为 synchronized 提供了替代方案。

(Lock) 不仅能实现 synchronized 的互斥功能,还能进一步实现线程间的同步功能。

锁的工作原理如下:在访问共享资源之前,申请用于保护资源的锁;当资源访问结束完成时,释放锁。当某个线程正在使用锁时,如果另一个线程尝试申请锁,那么后者将会阻塞等待,直到锁被前者释放位置。

锁的作用,逻辑上,就是一个令牌、通行证。持有这个令牌、通行证的线程才能继续执行。没有这个令牌、通行证的线程,无法继续执行,直到令牌的持有者放下令牌,而被它拿到后,它才能继续执行。

所有的锁都要实现 Lock 接口,最常用的 Lock 接口的实现类是 ReentrantLock

方法 描述
void lock() 进行等待,直到可以获得锁为止
void lockInterruptibly() throws ... 除非被中断,否则进行等待,直到可以获得锁为止
Condition newCondition() 返回与调用锁关联的 Condition 对象
boolean tryLock() 尝试获得锁,如果锁不可获得,立即返回 false;如果可获得,返回 true
boolean tryLock(long wait, TimeUnit unit) throws ... 在指定时间内,尝试获得锁。如果超出时间后仍无法获得,则返回 false;如果可获得,则返回 true
void unlock() 释放锁

ReentrantLock 实现了一种可重入锁,当前持有锁的线程能够重复进入这种锁。当然,对于线程重入锁而言,所有 lock ( ) 调用必须有相同数量的 unlock ( ) 调用进行抵消。

更多关于锁、同步、互斥、线程安全的内容参看《Java 线程安全》章节。