拆分面试题及答案.docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

拆分面试题及答案

Java中synchronized和ReentrantLock的区别及各自适用场景?

synchronized是Java关键字,JVM层面实现的内置锁,早期依赖操作系统的互斥量(Mutex)实现,存在用户态与内核态切换的性能损耗;ReentrantLock是JUC包下的显式锁,基于AQS(AbstractQueuedSynchronizer)实现,通过CAS和LockSupport.park()/unpark()完成线程阻塞与唤醒,性能更可控。

核心区别体现在:

1.锁获取方式:synchronized自动释放(同步块/方法执行完毕或异常退出),ReentrantLock需手动调用unlock()(通常配合try-finally确保释放);

2.可中断性:synchronized无法响应中断,ReentrantLock的lockInterruptibly()方法支持在等待锁时响应中断;

3.公平性:synchronized默认非公平(减少线程切换开销),ReentrantLock可通过构造函数指定公平锁(按等待队列顺序分配锁);

4.条件变量:synchronized仅支持一个wait/notify队列,ReentrantLock通过newCondition()可创建多个Condition对象,实现更细粒度的线程通信(如生产者-消费者模型中区分“生产条件”和“消费条件”)。

适用场景:简单同步需求(如方法同步)优先选synchronized(代码简洁);需可中断、公平锁或多条件变量时选ReentrantLock(如资源池的分配与回收,需精确控制线程唤醒顺序)。

详细说明HashMap在JDK7到JDK8的主要改进,包括扩容机制和哈希冲突解决方式的变化?

JDK7的HashMap采用“数组+链表”结构,哈希冲突时通过链表存储相同哈希值的节点;JDK8升级为“数组+链表+红黑树”,当链表长度≥8且数组长度≥64时,链表转换为红黑树(查询时间复杂度从O(n)降至O(logn)),红黑树在节点数≤6时回退为链表(避免频繁转换)。

扩容机制的核心改进:

1.哈希计算优化:JDK7的哈希值计算为h^(h16)后取模(h=key.hashCode()),JDK8直接通过(n-1)hash(n为数组长度)计算下标,且hash值计算时仅保留高16位与低16位的异或(减少高位信息丢失);

2.扩容迁移逻辑:JDK7扩容时遍历原链表,重新计算每个节点的下标并插入新数组(头插法,多线程下可能导致链表成环);JDK8改用尾插法,且利用“原索引”或“原索引+旧容量”的规律(因扩容是2的幂次,新容量为旧的2倍,节点新下标要么等于原下标,要么等于原下标+旧容量),通过判断hasholdCap是否为0,将链表拆分为两部分直接迁移,避免重复计算哈希。

改进原因:JDK7的头插法在多线程扩容时,若两个线程同时迁移链表,可能导致节点A的next指向节点B,而节点B的next又指回节点A,形成死循环;JDK8的尾插法和拆分迁移消除了这一问题。同时,红黑树的引入解决了链表过长时的查询性能问题(例如,当哈希冲突严重时,链表长度可能达到20,此时红黑树的查询效率提升显著)。

如何设计一个高并发场景下的用户登录接口?需要考虑哪些关键问题?

高并发登录接口的设计需从“性能、安全、可用性”三方面切入,关键问题及解决方案如下:

1.限流防刷:

采用令牌桶算法(如GuavaRateLimiter)限制单IP/单用户的请求频率(如1分钟最多10次登录尝试);

对频繁失败的请求强制校验验证码(如连续3次密码错误后弹出图片验证码或滑动验证);

网关层(如Nginx)配置请求速率限制(limit_req_zone),拦截超出阈值的请求。

2.安全加固:

密码传输加密:前端使用RSA非对称加密(公钥加密密码,私钥在服务端解密),避免明文传输;

防SQL注入:使用预编译语句(PreparedStatement)或ORM框架(如MyBatis)的{}占位符;

会话管理:提供随机且高强度的SessionID(如UUID+时间戳+随机数哈希),存储于Redis(设置合理过期时间,如30分钟),避免内存Session的分布式问题;

设备指纹:记录登录设备的MAC地址、浏览器UA等信息,异常登录时触发二次验证(如短信验证码)。

3.性能优化:

异步处理非核心逻辑:短信/邮件验证码发送、登录日志记录通过MQ(如RabbitMQ)异步处理,减少接口响应时间;

缓存用户信息:高频访问的用户基础

文档评论(0)

欣欣 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档