juc的核心,提供了一个先进先出队列
底层是双向列表 head节点和tail节点
AQS是用node实现FIFO(先进先出)构建锁或其他同步基础装置
用int类型表示状态
例如 0 就是没有线程获得锁
是个抽象类,模板方法模式
子类通过实现acquire和release操作状态
两种模式 独占锁和共享锁
独占控制和共享控制
线程尝试获取锁,如果失败,包装成node加入队列
持有锁的线程获取锁,唤醒后续等待线程
同步组件
- CountDownLatch (通过计数阻塞线程)
- Semaphore (控制并发线程数)
- CyclicBarrier (和CountDownLatch很像,可以重用)
- ReentrantLock
- Condition
- FutureTask
ReentrantLock 和Condition
java里的锁 2 类
- Synchronize
- J.U.C提供的锁
ReentrantLock和synchronized的区别
- 可重入性 2个都可以重入
- 锁的实现 ReentrantLock是JAVA实现的,sync 是jvm实现的
- 性能的区别 (sync优化以后,性能差不多)
- 功能区别
sync不用手动释放,ReentrantLock需要手动释放 - ReentrantLock 独有的功能
1、可以指定是公平锁还是非公平锁,sync只能非公平
2、提供Condition类,分组唤醒需要唤醒的线程
3、提供能够中断等待锁的线程的机制
通过循环调用cas提高性能,避免进入内核态阻塞。
sync能做的ReentrantLock都能做。
ReentrantLock用于复杂情况,一般并发用synchronized就ok。