
本文主要介绍java 中并发包中与锁相关的和组件,以及使用方式和实现细节。
Lock 的出现 : Java SE 5之后出现的,提供了synchronized 没有的功能,比如说可中断的获取锁,超时获取锁等等,当出现需要获取锁的组合的时候,用synchronized 就没有那么容易实现了。
- 队列同步器
AbstractQueuedSynchronized 是用来构建锁和其他同步组件的基础框架:
Provides a framework for implementing blocking locks and related
-
synchronizers (semaphores, events, etc) that rely on
-
first-in-first-out (FIFO) wait queues. This class is designed to
-
be a useful basis for most kinds of synchronizers that rely on a
-
single atomic {@code int} value to represent state.
同步器是实现锁的关键,利用同步器实现锁的语义,锁是面向用户的,而同步器是面向锁的实现者的。同步器提供的模板方法基本分为3类,独占和共享式获取和释放同步状态和查询队列中的等待线程情况,自定义组件需要使用这些方法来实现自己的同步语义。
具体的实现原理可以参考AbstractQueueSynchronized 源码,后面将会有片文章专门来解读这个类。
独占式:

共享式和独占式的区别是,能不能在同一时刻有多个线程获取到同步状态。
几种常见的API.
(1) 一般的锁都是排它锁,还有一种是读写锁,读锁不排斥其他读线程,写只允许一个线程写。 对于一般场景下面,读是超过写的,所以性能上面也能提供并发量个吞吐量,Java 里面提供了ReentrantReadWriteLock.
(2) Locksupport 定义一组以park/unpark 开头的方法来对线程进行阻塞和释放
(3) Condition: 提供了monitor 一类的方法。Await/signal ,和 lock 配合之后就是替换了
Synchronized/wait/notify 的消息通知机制。
网友评论