Java -- Thread -- Collection -- 11 Java5的线程锁技术
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,
接口摘要 |
||
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。 |
||
Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。 |
||
ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。 |
||
类摘要 |
||
可以由线程以独占方式拥有的同步器。 |
||
以 long 形式维护同步状态的一个 AbstractQueuedSynchronizer 版本。 |
||
为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。 |
||
用来创建锁和其他同步类的基本线程阻塞原语。 |
||
一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 |
||
支持与 ReentrantLock 类似语义的 ReadWriteLock 实现。 |
||
Lock比传统线程模型中的synchronized更加面向对象,锁本身也是一个对象,两个线程执行的代码要实现同步互斥效果,就要使用同一个锁对象。锁要上在要操作的资源类的内部方法中,而不是线程代码中。
public interface Lock
所有已知实现类:
ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock
随着灵活性的增加,也带来了更多的责任。不使用块结构锁就失去了使用 synchronized 方法和语句时会出现的锁自动释放功能。在大多数情况下,应该使用以下语句:
Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }
锁定和取消锁定出现在不同作用范围中时,必须谨慎地确保保持锁定时所执行的所有代码用 try-finally 或 try-catch 加以保护,以确保在必要时释放锁。
方法摘要 |
|
void |
lock() 获取锁。 |
void |
lockInterruptibly() 如果当前线程未被中断,则获取锁。 |
newCondition() 返回绑定到此 Lock 实例的新 Condition 实例。 |
|
boolean |
tryLock() 仅在调用时锁为空闲状态才获取该锁。 |
boolean |
tryLock(long time, TimeUnit unit) 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。 |
void |
unlock() 释放锁。 |
Lock与synchronized对比,打印字符串例子:
holder