Java项目高频面试题及答案.docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Java项目高频面试题及答案

1.项目里用HashMap存用户数据,多线程操作时出现过问题吗?怎么解决的?

答:遇到过ConcurrentModificationException(并发修改异常),比如一个线程遍历HashMap查用户,另一个线程同时删过期用户就会报。

一开始试了用Collections.synchronizedMap包一层,但后来发现高并发下慢——因为它是给整个Map加锁,所有操作都排队。

后来换成ConcurrentHashMap,它在JDK1.8里是按数组分段加锁(CAS+synchronized),只有操作同一分段才会锁,效率高很多。比如项目里秒杀场景,用它存用户抢购记录,每秒千级请求也没问题。

2.Spring注入Service时,用构造器注入还是setter注入?实际项目选哪个?

答:都用过,但现在主要用构造器注入。

之前用setter注入,配合@Autowired很方便,但有个坑:如果Service依赖3个DAO,setter注入时可能只注入了2个,编译不报错,运行时才发现空指针——因为依赖没强制初始化。

后来换成构造器注入,依赖必须在创建Service时传全,编译阶段就会报错,避免漏注入。比如项目里订单Service依赖订单DAO、支付DAO、日志DAO,用构造器注入后,只要少传一个,IDE就会标红,提前解决问题。另外Spring官方也推荐构造器注入,说更符合“依赖不可变”的设计原则。

3.项目里查数据库时,明明加了索引,为什么查询还是慢?怎么排查的?

答:遇到过两种常见情况。

第一种是索引失效了。比如用户表phone字段是varchar,查的时候写的是wherephone没加引号),MySQL会自动做类型转换,导致索引用不上,全表扫描。后来把SQL改成wherephone查询时间从500ms降到30ms。

第二种是索引建错了。比如订单表查“用户ID+订单状态”的列表,一开始只给用户ID建了单值索引,查的时候还是要扫用户下所有订单。后来改成联合索引(user_id,order_status),再查的时候直接走索引定位,速度快了10倍。

排查方法就是用explain看SQL执行计划:如果key列是NULL,说明没走索引;如果rows列数值很大,说明扫描行数多,得优化索引。

4.线程池参数怎么设置?比如项目里处理订单异步通知,核心线程数、最大线程数设多少?

答:不是固定值,得看业务类型。订单异步通知属于IO密集型(要调用第三方支付接口,等响应),这种场景线程大部分时间在等IO,所以线程数可以设多一点。

我们项目里服务器是4核8G,核心线程数设的是8(2*CPU核心数),最大线程数16,队列用LinkedBlockingQueue,容量设1000。

这么设的原因:IO密集型任务,线程数多能提高CPU利用率——比如一个线程等接口响应时,其他线程可以处理别的通知。如果设少了,比如核心线程数4,订单峰值时队列会堆满,通知延迟;设太多,线程切换开销大,反而慢。

另外拒绝策略选的是CallerRunsPolicy,万一队列满了,让调用线程自己处理,避免通知丢失——比如支付回调不能丢,丢了用户钱扣了订单没更,麻烦。

5.项目里怎么处理分布式事务?比如下单时要扣库存、减余额、生成订单,三个操作跨服务,怎么保证要么都成要么都败?

答:之前用的是Seata的AT模式,因为它对代码侵入性小,不用改太多业务逻辑。

具体流程:下单接口作为全局事务发起者,加@GlobalTransactional注解;扣库存、减余额的服务作为分支事务,加@Transactional注解。

Seata会在发起者这边生成全局事务ID,然后分支事务执行时,会先记录undolog(比如扣库存前的库存值),再执行SQL。如果所有分支都成功,Seata会提交全局事务,删除undolog;如果有一个分支失败,Seata会回滚所有分支——用undolog把数据恢复到之前的状态。

比如项目里有次减余额服务超时,Seata自动回滚了扣库存和生成订单的操作,没出现“库存扣了但订单没生成”的情况。不过要注意,AT模式需要数据库支持,比如MySQL要开事务日志,而且表得有主键。

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档