jdk常用库源码知识点

46 阅读3分钟
  • 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会好些。