IT评测·应用市场-qidao123.com

标题: 【Java八股文】03-Java并发口试篇 [打印本页]

作者: 民工心事    时间: 2025-3-18 22:41
标题: 【Java八股文】03-Java并发口试篇

多线程

java里面的线程和操纵系统的线程一样吗?

在类 UNIX 系统中,Java 通过 pthread_create 来创建内核级线程,并且返回线程创建是否成功的状态码。大多数情况下,JVM 中的 Java 线程和操纵系统的内核级线程是一一对应的。
使用多线程要注意哪些问题?


包管数据一致性的方案有哪些?


创建线程的方法


并发安全

juc包下常用的类


怎么包管多线程安全

除了使用juc包下的类,还可以通过一些关键字:

Java中常用的锁


synchronized和reentrantlock区别?

特性synchronizedReentrantLock锁类型内置锁显式锁加锁和解锁主动加锁,主动解锁通过 lock() 加锁,unlock() 解锁可中断性不可中断可中断,通过 lockInterruptibly() 方法公平性非公平锁可设置为公平锁可重入性可重入可重入条件变量内建条件变量 wait()、notify()通过 Condition 提供灵活的条件变量性能较低,尤其在竞争猛烈时更高,特别在高并发和必要灵活控制的场景死锁制止必要开辟者鉴戒制止死锁提供 tryLock() 方法来制止死锁 怎样明白可重入锁?

可重入锁允许同一线程在已经持有锁的情况下再次获取该锁,背后通过一个计数器来记载线程获取锁的次数。每当线程哀求锁时,计数器增加;每次释放锁时,计数器减少,直到计数器为 0 时,锁才会被完全释放。这种机制制止了线程在递归或多层方法调用中因重复加锁导致的死锁问题。
死锁产生的必要条件


死锁的处理策略:破坏其中恣意一个即可
线程池

线程池参数

  1. // 创建线程池
  2. ThreadPoolExecutor threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE,
  3.                                              MAXIMUM_POOL_SIZE,
  4.                                              KEEP_ALIVE,
  5.                                              TimeUnit.SECONDS,
  6.                                              sPoolWorkQueue,
  7.                                              sThreadFactory);
  8. // 向线程池提交任务
  9. threadPool.execute(new Runnable() {
  10.     @Override
  11.     public void run() {
  12.         ... // 线程执行的任务
  13.     }
  14. });
  15. // 关闭线程池
  16. threadPool.shutdown(); // 设置线程池的状态为SHUTDOWN,然后中断所有没有正在执行任务的线程
  17. threadPool.shutdownNow(); // 设置线程池的状态为 STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表
复制代码

使命队列workQueue

使命队列是基于阻塞队列实现的,即采用生产者消耗者模式,在 Java 中必要实现BlockingQueue 接口。但 Java 已经为我们提供了 7 种阻塞队列的实现

注意有界队列和无界队列的区别:如果使用有界队列,当队列饱和时并凌驾最大线程数时就会实验拒绝策略;而如果使用无界队列,由于使命队列永久都可以添加使命,以是设置 maximumPoolSize 没有任何意义。
拒绝策略handler

当线程池的线程数达到最大线程数时,必要实验拒绝策略。拒绝策略必要实现 RejectedExecutionHandler 接口,并实现 rejectedExecution(Runnable r, ThreadPoolExecutor executor) 方法。不外 Executors 框架已经为我们实现了 4 种拒绝策略:

线程池参数经验


场景一:电商场景,特点瞬时高并发、使命处理时间短,线程池的配置可设置如下:
  1. ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
  2.                                                                                      16, // 8核*2
  3.                                              32, // 最大*2
  4.                                              10, // 非核心线程空闲10s回收
  5.                                              TimeUnit.SECONDS,
  6.                                              new SynchronousQueue<>(), //不缓存任务,直接扩容
  7.                                              new AbortPolicy() // 直接拒绝
  8.                                  );
复制代码
场景二:后台数据处理服务,特点稳定流量、使命处理时间长(秒级)、允许一定耽误,线程池的配置可设置如下:
  1. ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
  2.                                                                                      8, //
  3.                                              8, // 禁止扩容,避免消耗资源
  4.                                              0, // 为了稳定不回收
  5.                                              TimeUnit.SECONDS,
  6.                                              new ArrayBlockingQueue<>(1000), // 有界队列,容量1000
  7.                                              new CallerRunsPolicy() // 满了叫人来
  8.                                  );
复制代码
场景三:微服务HTTP哀求处理,特点IO密集型、依靠下游服务相应时间,线程池的配置可设置如下:
  1. ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
  2.                                                                                      16, // 8核*2
  3.                                              64, // 下游满的话多设置一点
  4.                                              60, // 非核心线程空闲60s回收
  5.                                              TimeUnit.SECONDS,
  6.                                              new ArrayBlockingQueue<>(200), // 有界队列,容量200
  7.                                              new CustomRetryPolicy() // 自定义拒绝策略(重试或降级)
  8.                                  );
复制代码
功能线程池


但是根据《阿里巴巴 Java 开辟手册》中禁止使用Executors类来举行创建线程池,会引发大量的生产事故,以是线程池的使用还是要结合具体的使用场景。
线程池中shutdown (),shutdownNow()这两个方法有什么作用?



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4