当前位置: 首页 > article >正文

技术总结(七)

一、什么是可重入锁

可重入锁(Reentrant Lock)是一种允许同一个线程多次获取同一把锁的机制。‌ 它也被称为递归锁,因为同一个线程可以重复获取一个锁多次,同样的,在释放时也需要释放多次。‌

可重入锁的特性包括:

同一线程多次获取同一把锁‌:同一个线程可以多次获取同一把锁,而不会导致死锁。

递归特性‌:当一个线程已经持有锁时,它可以再次请求该锁,而不会因为已经持有锁而阻塞。

二、为什么要用线程池?

池化技术想必大家已经屡见不鲜了,线程池、数据库连接池、HTTP 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。

线程池提供了一种限制和管理资源(包括执行一个任务)的方式。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。

这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

三、线程池常见参数有哪些?如何解释?

    /**
     * 用给定的初始参数创建一个新的ThreadPoolExecutor。
     */
    public ThreadPoolExecutor(int corePoolSize,//线程池的核心线程数量
                              int maximumPoolSize,//线程池的最大线程数
                              long keepAliveTime,//当线程数大于核心线程数时,多余的空闲线程存活的最长时间
                              TimeUnit unit,//时间单位
                              BlockingQueue<Runnable> workQueue,//任务队列,用来储存等待执行任务的队列
                              ThreadFactory threadFactory,//线程工厂,用来创建线程,一般默认即可
                              RejectedExecutionHandler handler//拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务
                               ) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

ThreadPoolExecutor 3 个最重要的参数:

  • corePoolSize : 任务队列未达到队列容量时,最大可以同时运行的线程数量。
  • maximumPoolSize : 任务队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
  • workQueue: 新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。

ThreadPoolExecutor其他常见参数 :

  • keepAliveTime:当线程池中的线程数量大于 corePoolSize ,即有非核心线程(线程池中核心线程以外的线程)时,这些非核心线程空闲后不会立即销毁,而是会等待,直到等待的时间超过了 keepAliveTime才会被回收销毁。
  • unit : keepAliveTime 参数的时间单位。
  • threadFactory :executor 创建新线程的时候会用到。
  • handler :拒绝策略(后面会单独详细介绍一下)。

下面这张图可以加深你对线程池中各个参数的相互关系的理解(图片来源:《Java 性能调优实战》):


http://www.kler.cn/news/354021.html

相关文章:

  • 解决ultralytics中的YOLOv8在执行task.py文件添加模块操作出现的KeyError报错
  • Linux-lvs
  • 芒果YOLOv10改进136:注意力机制MLLA|即插即用:融合Mamba设计精髓的线性注意力视觉Transformer
  • Ubuntu(Linux)tcpdump使用方法详解
  • 金融信用评分卡建模项目:AI辅助
  • mysql指令笔记(基本)
  • C#/WinForm 自定义控件绘制章鱼
  • 【2022工业3D异常检测文献】Patch+FPFH: 结合3D手工点云描述符和颜色特征的异常检测方法
  • xlsx xlsx-style-vite 实现前端根据element 表格导出excel且定制化样式 背景 列宽等
  • 【网络安全】-vulnhub靶场-noob
  • 顺序表的查找
  • 如何将闲置平板变为电脑显示器?GameViewer远程助你低成本实现0门槛副屏串流!
  • 基于Redis实现的延迟队列
  • MATLAB基础应用精讲-【数模应用】HLM模型
  • 20240803 芯动科技 笔试
  • 10秒钟用Midjourney画出国风味的变形金刚
  • 重塑输电线路运维管理,巡检管理系统守护电网稳定运行
  • JAVA地狱级笑话
  • linuxC读取bin文件
  • 大数据面试题整理——MapReduce