jdk常用库源码知识点
- LongAdder:适用于高并发下的加法,内部维护了一个或者多个cell,多线程情况下分担到不同的cell从而减少了竞争
- LongAccumulator: 类似LongAdder,额外提供初始值以及自定义双目函数
- AbstractQueuedSynchronizer:同步器的基石,ReentrantLock 、CountDownLatch等工具都是基于AQS
cloud.tencent.com/developer/a…
- ReentrantLock: ReentrantLock 基于AbstractQueuedSynchronizer 支持公平锁和非公平锁,还支持类似Object的wait和notify的功能 Condition,相比较Object的wait和notifyCondition功能更强大,能指定唤起读或者写的等待线程
- ReentrantReadWriteLock :内部维护了一个读锁和写锁,在读多写少的情况下性能优于reentrantLock
- StampedLock:不可重入,不可中断,相比较ReentrantReadWriteLock 多了乐观读,避免了写锁饥饿的问题
- ArrayBlockingQueue和LinkedBlockingQueue: 内部都使用了ReentrantLock+Condition 进行同步控制
- FutureTask 和CompletableFuture:future 不支持传递,不支持结果合并,异常 定位较麻烦,内部都使用 了类似AQS的等待队列
- ConcurrentHashMap :
- 不允许插入null的key和value,多线程情况下不容忍
- (n-1)&hash 求数组下标,相比较取模运算效率更高,所以数组的长度需要是2^n
- 1.8相比较1.7
- 锁结构由segment+HashEntry 改成 cas+synchronized+链表
- 1.7需要对key进行两次定位,一次segment一个entry
- 1.8统计数量使用了LongAdder,并发性能更佳
- ConcurrentSkipListMap:内部使用了跳表,相比较ConcurrentHashMap的优点:
- ConcurrentSkipListMap是有序的
- ConcurrentSkipListMap支持更高的并发,在相同数据的情况下,线程越多ConcurrentSkipListMap性能体 验越好
- CountDownLatch :继承AQS 使用了共享模式,控制多线程阻塞等待 同一组结果后同时执行
- CyclicBarrierL: 内部使用ReentrantLock.Condition 实现等待唤醒
- Exchanger: 实现两个线程间数据交换
- Semaphore:计数信号量,它允许n个任务同时访问某个资源,超过n的任务阻塞等待,内部使用AQS 的共享模式
- ThreadLocalRandom:结合ThreadLocal和Random 每个线程独立维护随机种子,避免竞争
- ThreadPoolExecutor:线程吃 参数详解:
- corePoolSize 核心线程数
- maximumPoolSize 最大线程数 ,当所有核心线程沾满时在有新任务继续放到阻塞队列中,如果队列满了 创建新的线程直到maximumPoolSize,
- keepAliveTime 空闲线程存活的时间
- unit
- workQueue 阻塞队列
- handler 拒绝策略:
- AbortPolicy 直接报错
- DiscardPolicy 直接丢掉
- DiscardOldestPolicy 丢弃最老的任务
- CallerRunsPolicy 提交任务的线程直接执行
- ThreadLocal:线程变量,每个线程独立副本,空间换时间
- volatile:保证内存可见性、顺序性
- synchronized:www.zhihu.com/question/48…
- synchronized 和 ReentrantLock:
1、与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性。例如:时间锁等候,可中断锁等候,锁投票。
2、ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合。
3、ReentrantLock提供了可轮询的锁请求。它会尝试着去获取锁,如果成功则继续,否则可以等到下次运行时处理,而synchronized则一旦进入锁请求要么成功要么阻塞,所以相比synchronized而言,ReentrantLock会不容易产生死锁些。
4、ReentrantLock支持更加灵活的同步代码块,但是使用synchronized时,只能在同一个synchronized块结构中获取和释放。注:ReentrantLock的锁释放一定要在finally中处理,否则可能会产生严重的后果。
5、ReentrantLock支持中断处理,且性能较synchronized会好些。