在百度上怎么建网站,重庆建设网站的公司哪家好,电子商务网站多少钱,搜索型网站1.在项目经历里挑一个详细介绍一下 项目的应用场景
2.项目里用到多线程是怎么用的#xff1f;回答#xff1a;线程池
用通过 ThreadPoolExecutor 构造函数的方式创建的线程池
3.线程池有哪些重要参数#xff1f;回答#xff1a;核心线程数、最大线程数、阻塞队列类型、…1.在项目经历里挑一个详细介绍一下 项目的应用场景
2.项目里用到多线程是怎么用的回答线程池
用通过 ThreadPoolExecutor 构造函数的方式创建的线程池
3.线程池有哪些重要参数回答核心线程数、最大线程数、阻塞队列类型、抛出策略还有线程池类型。
线程池的核心线程数、最大线程数当线程数大于核心线程数时多余的线程存活的时间任务队列拒绝策略。
4.线程池类型有哪些回答有固定一个线程的还有按照参数指定线程数的还有按时执行任务的。
基于ThreadPoolExecutor共有四种类型线程池
FixedThreadPool固定数量线程池
SingleThreadExecutor单线程线程池
CachedThreadPool缓存线程池是一种大小可变的线程池线程数量根据任务的数量自动调整。
ScheduledThreadPoolExecutor调度线程池周期性地执行任务或者在指定的时间执行任务。
一般不建议采用Excutors类创建上述线程池而是建议大家使用构造函数去创建线程池这样的处理方式让写的同学更加明确线程池的运行规则规避资源耗尽的风险
1FixedThreadPool 和 SingleThreadExecutor使用的是无界阻塞队列任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求从而导致 OOM。
2CachedThreadPool使用的是同步队列允许创建的线程数量为 Integer.MAX_VALUE 如果任务数量过多且执行速度较慢可能会创建大量的线程从而导致 OOM。
3ScheduledThreadPool 和 SingleThreadScheduledExecutor : 使用的无界的延迟阻塞队列DelayedWorkQueue任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求从而导致 OOM。 容量为 Integer.MAX_VALUE 的 LinkedBlockingQueue无界队列FixedThreadPool 和 SingleThreadExector 。由于队列永远不会被放满因此FixedThreadPool最多只能创建核心线程数的线程。SynchronousQueue同步队列CachedThreadPool 。SynchronousQueue 没有容量不存储元素目的是保证对于提交的任务如果有空闲线程则使用空闲线程来处理否则新建一个线程来处理任务。也就是说CachedThreadPool 的最大线程数是 Integer.MAX_VALUE 可以理解为线程数是可以无限扩展的可能会创建大量线程从而导致 OOM。DelayedWorkQueue延迟阻塞队列ScheduledThreadPool 和 SingleThreadScheduledExecutor 。DelayedWorkQueue 的内部元素并不是按照放入的时间排序而是会按照延迟的时间长短对任务进行排序内部采用的是“堆”的数据结构可以保证每次出队的任务都是当前队列中执行时间最靠前的。DelayedWorkQueue 添加元素满了之后会自动扩容原来容量的 1/2即永远不会阻塞最大扩容可达 Integer.MAX_VALUE所以最多只能创建核心线程数的线程。
5.实际工作中参数怎么选择呢比如核心线程数回答核心线程数和cpu个数有关一般是2n1个
这是固定的不是固定的要看任务是主要使用cpu的还是占用cpu比较少的。
如果我们设置的线程池数量太小的话如果同一时间有大量任务/请求需要处理可能会导致大量的请求/任务在任务队列中排队等待执行甚至会出现任务队列满了之后任务/请求无法处理的情况或者大量任务堆积在任务队列导致 OOM。这样很明显是有问题的CPU 根本没有得到充分利用。
如果我们设置线程数量太大大量线程可能会同时在争取 CPU 资源这样会导致大量的上下文切换从而增加线程的执行时间影响了整体执行效率。
假设机器有N个CPU那么对于计算密集型的任务压缩、解压缩、加密、解密、科学计算等应该设置线程数为N1对于IO密集型的任务MySQL 数据库、文件的读写、网络通信应该设置线程数为2N对于同时有计算工作和IO工作的任务应该考虑使用两个线程池一个处理计算任务一个处理IO任务分别对两个线程池按照计算密集型和IO密集型来设置线程数。
最佳线程数 NCPU 核心数∗1WT线程等待时间/ST线程计算时间其中 WT线程等待时间线程运行总时间 - ST线程计算时间WT/ST可以通过VisualVM 来查看。
综合来看我们可以根据自己的业务场景从“N1”和“2N”两个公式中选出一个适合的计算出一个大概的线程数量之后通过实际压测逐渐往“增大线程数量”和“减小线程数量”这两个方向调整然后观察整体的处理时间变化最终确定一个具体的线程数量。
6.多线程会带来一些并发问题一般用锁来处理。乐观锁和悲观锁你了解吗都是什么概念应用于什么场景
悲观锁总是假设最坏的情况认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改)所以每次在获取资源操作的时候都会上锁这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说共享资源每次只给一个线程使用其它线程阻塞用完后再把资源转让给其它线程。常见的悲观锁有java的synchronized、ReentrantLock等独占锁。悲观锁通常用于写比较多的情况可以避免频繁失败和重试影响性能开销是固定的。
乐观锁总是假设最好的情况认为共享资源每次被访问的时候不会出现问题线程可以不停地执行无需加锁也无需等待只是在提交修改的时候去验证对应的资源也就是数据是否被其它线程修改了具体方法可以使用版本号机制或 CAS 算法。JUC包下的原子变量类比如AtomicInteger、LongAdder就是使用了乐观锁的一种实现方式CAS实现的。乐观锁通常用于写比较少的情况比如多读场景竞争比较少可以避免频繁加锁影响性能。不过乐观锁主要针对的对象是单个共享变量。
从 JDK 1.5 开始提供了AtomicReference类来保证引用对象之间的原子性你可以把多个变量放在一个对象里来进行 CAS 操作.所以我们可以使用锁或者利用AtomicReference类把多个共享变量合并成一个共享变量来操作。
7.你用过的锁有哪些sychronized锁升级的流程
8.看你的简历有一个oom的排查和一个循环依赖的排查能详细讲讲吗这里讲的不好再深入一下
9.你项目哪里用到了redis 怎么用的这里因为没问过也没深入下去接下来把redis加入到项目里
10.项目主要用mysql处理过海量数据吗 有哪些优化手段一般对哪些字段建索引索引的个数为什么不是越多越好
11.看简历写到过设计模式你熟悉哪些设计模式 回答了建造者、简单工厂。
了解代理模式吗哪里用过代理模式
12.hashmap结构
13.怎么判断能获取到的mysql锁是表级锁还是行级锁
14.平时使用update select这些语句什么情况下会上锁会上哪种锁
一些非技术相关提问
1.过去开发时候 产品 测试 前端这些都有吧 介绍一下大概多少人 都有哪些角色参与生产
提问组里的人员构成和架构组里主要做什么 信贷平台的底层平台 做一些支付或者用户权限的认证 十个人 每两三个一组。初中高级比例大概怎么样一比一
2.如果已经开发要完成了产品提出加需求怎么办
3.今天面试我很多地方深入的了解都不够你比较看中求职者哪些方面技术能力。比如redis这种我没有实际没有应用的但是自己也看了一下但没有实际经验面试官也不接着问下去了比如这种知识我怎么准备呢
这还是每个面试官有不同的侧重点从我的角度我更看重对你用过的技术的考察如果工作三到四年没用过redis就不正常但是你经验一年可以理解但是目前大多数面试的十个人里面只有一两个没用过所以还是建议多一些实际使用的经验。 总结
1.多线程、mysql调优这些用过的但是不深入的东西需要重点学习
2.redis看完基础教程以后加入到项目里不要让他成为短板。
3.OOM和循环依赖那个的介绍要再熟悉深入一下。
4.leetcode还是要继续刷。