赞
踩
问题来源于某客,如下图所示:
问题链接:https://www.nowcoder.com/feed/main/detail/b12f8ece42f6485d8e462ab872c4f8d8
答案解析
线程池的创建方法总共有 7 种,但总体来说可分为 2 类:
线程池的创建方式总共包含以下 7 种(其中 6 种是通过 Executors 创建的,1 种是通过 ThreadPoolExecutor 创建的):
问到线程池参数的含义,一定是问 ThreadPoolExecutor 参数的含义,这七个参数的含义分别是: 7 个参数代表的含义如下:
参数 1:corePoolSize
核心线程数,线程池中始终存活的线程数。
参数 2:maximumPoolSize
最大线程数,线程池中允许的最大线程数,当线程池的任务队列满了之后可以创建的最大线程数。
参数 3:keepAliveTime
最大线程数可以存活的时间,当线程中没有任务执行时,最大线程就会销毁一部分,最终保持核心线程数量的线程。
参数 4:unit:
单位是和参数 3 存活时间配合使用的,合在一起用于设定线程的存活时间 ,参数 keepAliveTime 的时间单位有以下 7 种可选:
参数 5:workQueue
一个阻塞队列,用来存储线程池等待执行的任务,均为线程安全,它包含以下 7 种类型:
较常用的是 LinkedBlockingQueue 和 Synchronous,线程池的排队策略与 BlockingQueue 有关。
参数 6:threadFactory
线程工厂,主要用来创建线程,默认为正常优先级、非守护线程。
参数 7:handler
拒绝策略,拒绝处理任务时的策略,系统提供了 4 种可选:
默认策略为 AbortPolicy。
锁升级的过程指的是 synchronized 锁升级的过程,synchronized 锁升级机制也叫做锁膨胀机制,此机制诞生于 JDK 6 中。
在 Java 6 及之前的版本中,synchronized 的实现主要依赖于操作系统的 mutex 锁(重量级锁),而在 Java 6 及之后的版本中,Java 对 synchronized 进行了升级,引入了锁升级的机制,可以更加高效地利用 CPU 的多级缓存,提升了多线程并发性能。
synchronized 锁升级的过程可以分为以下四个阶段:无锁状态、偏向锁、轻量级锁和重量级锁。其中,无锁状态和偏向锁状态都属于乐观锁,不需要进行锁升级,锁竞争较少,能够提高程序的性能。只有在锁竞争激烈的情况下,才会进行锁升级,将锁升级为轻量级锁状态。
下面是 synchronized 锁升级的具体流程:
无锁状态 当一个线程访问一个同步块时,如果该同步块没有被其他线程占用,那么该线程就可以直接进入同步块,并且将同步块标记为偏向锁状态。这个过程不需要进行任何加锁操作,属于乐观锁状态。
偏向锁状态 在偏向锁状态下,同步块已经被一个线程占用,其他线程访问该同步块时,只需要判断该同步块是否被当前线程占用,如果是,则直接进入同步块。这个过程不需要进行任何加锁操作,仍然属于乐观锁状态。
轻量级锁状态 如果在偏向锁状态下,有多个线程竞争同一个同步块,那么该同步块就会升级为轻量级锁状态。此时,每个线程都会在自己的 CPU 缓存中保存该同步块的副本,并通过 CAS(Compare and Swap)操作来对同步块进行加锁和解锁。这个过程需要进行加锁操作,但相对于传统的 mutex 锁,轻量级锁的效率要高很多。
重量级锁状态 轻量级锁之后会通过自旋来获取锁,自旋执行一定次数之后还未成功获取到锁,此时就会升级为重量级锁,并且进入阻塞状态。
synchronized 锁升级的过程可以有效地减少锁竞争,提高多线程并发性。
保证 i++ 线程安全的手段是加锁,可以通过 synchronized 或 Lock 加锁来保证 i++ 的线程安全。
HashMap 和 ConcurrentHashMap 是 Map 接口的具体实现,ConcurrentHashMap 可以看作是 HashMap 的线程安全版本,它们的具体区别如下:
@Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有以下不同:
说到设计模式可以举一些常见的设计模式,以及这些设计模式的具体应用,比如以下这些:
Redis 运行比较快的原因有以下几个:
MySQL 索引根据不同的维度可以分为不同类型,比如以下这些:
索引优化
索引优化可以从以下几个方面入手:
解题思路和实现代码参考:https://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a?tpId=196&tqId=37071
从上面的题可以看出来,团子的整体面试题是不难的,可以说社招的面试难度,现在是小于校招的面试难度的,这也可能和校招庞大的竞争者群体有关。所以如果是社招的哥们,也可以定期骑驴找马试试水,一是检验自己能力是否已经落后与用人市场;二是,万一有惊喜,拿到更好的 offer,也就开启了职场的新篇章。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。