1.Lock接口
锁是用来控制多个线程访问共享资源的方式。在Java SE5 Lock接口出现之前,通过synchronized实现锁功能。
1.1 Lock接口提供的synchronized关键字不具备的主要特性
| 特性 | 描述 |
|---|---|
| 尝试非阻塞的获取锁 | 当前线程尝试获取锁,如果这一时刻没有被其他线程获取到,则成功获取并持有锁 |
| 能被中断的获取锁 | 与synchronized不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放 |
| 超时获取锁 | 在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回 |
//非阻塞的含义:永远不会因为任务不能完成而挂起等待。
1.2 Lock接口API
2.队列同步器AQS(AbstractQueueSynchronizer)
2.1 同步队列
2.2 独占式同步状态获取与释放
总结:在获取同步状态时,同步器维护一个同步队列,获取状态失败的线程都会被加入到队列中并在队列中进行自旋;移出队列(或停止自旋)的条件是前驱节点为头节点并成功获取了同步状态。在释放同步状态时,同步器调用tryRelease方法释放同步状态,然后唤醒头节点的后继节点。
2.3 共享式同步状态获取与释放
共享式获取与独占式获取最主要的区别在于同一时刻能否有多个线程同时获取到同步状态。
获取:成功获取到 同步状态并退出自旋的条件就是tryAcquireShared(int arg)方法返回值大于等于0。在doAcquireShared(int arg)方法的自旋过程中,如果当前节点的前驱为头节点时,尝试获取同步状态,如果返回值大于等于0,表示该次获取同步状态成功并从自旋过程中退出。
释放:releaseShared方法在释放同步状态之后,将会唤醒处于等待状态的节点。对于能够支持多个线程同时访问的并发组件,它和独占式主要区别是在于tryReleaseShared(int arg)方法必须确保同步状态(或者资源数)线程安全释放,一般是通过循环和CAS来保证的,因为释放同步状态的操作会同时来自多个线程。
2.4 独占式超时获取同步状态
//辛苦打的字被csdn吞了,懒得再来一遍,就直接截图吧