线程池底层原理

线程池底层原理

大厂面试题:

1、请你谈谈对volatile的理解?

2、CAS你知道吗?

3、原子类AtomicInteger的ABA问题谈谈?原子更新引用知道吗?

4、我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案?

5、公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。

6、CountDownLatch、CyclicBarrier、Semaphore使用过吗?

7、阻塞队列知道吗?

8、线程池用过吗?ThreadPoolExecutor谈谈你的理解?

9、线程池用过吗?生产上你是如何设置合理参数?

10、死锁编码及定位分析?

 

1、线程池底层原理架构图

线程池底层原理_第1张图片

2、线程池主要处理流程图

线程池底层原理_第2张图片

3、线程池主要处理流程解释(重要

1、在创建了线程池后,等待提交过来的任务请求。

2、当调用execute()方法添加一个任务请求,线程池会做如下判断:

       2.1 如果正在运行的线程数小于corePoolSize,那么马上会创建线程运行这个任务;

       2.2 如果正在运行的线程数大于或者等于corePoolSize,那么会将这个任务放入队列;

       2.3 如果这时候队列满了并且正在运行的线程数量还小于maximumPoolSize,那么还是要创建非核心线程运行这个任务;

       2.4 如果队列满了并且线程数大于或者等于maximumPoolSize,那么会启动饱和拒绝策略来执行。

3、当一个线程完成时,它会从队列中取下一个任务来执行。

4、当一个线程无事可做,且超过一定的时间(keepAliveTime)时,线程池会判断:

       如果当前运行的线程数大于corePoolSize,那么这个线程会停掉。

       所以线程池的所有任务完成后,它最终会收缩到corePoolSize的大小。

你可能感兴趣的:(Java,Java,JUC分析)