菜鸟直管Java开发一面面经
《面试题目》
- 自我介绍及基本信息确认
- 面向对象语言的特性有哪些?
- 子类继承父类后可以重写方法吗?
- 接口和抽象类的区别是什么?
- 创建线程的方式有哪些?
- 举几个线程安全和线程不安全的集合
- ArrayList 是线程不安全的,如果要在多线程环境下使用该如何保证线程安全?多线程删除或更新 ArrayList 会有什么问题?
- RESTful 协议通常有哪些方法?POST 可以用来获取资源吗?
- MySQL 和 Redis 为什么会出现数据不一致?你是怎么解决的?
- 延时双删的延迟时间设置会不会对性能影响很大?如何权衡?
- 抽奖系统的高并发是怎么保证的?
- MySQL 的索引结构是 B 树还是 B+树?两者的区别是什么?
《参考解析》
- 多线程环境下安全使用 ArrayList:可以用
Collections.synchronizedList()包装、或直接使用CopyOnWriteArrayList(适合读多写少场景,写时复制底层数组,读操作无需加锁)。多线程并发删除/更新 ArrayList 最常见的问题是ConcurrentModificationException(迭代过程中被其他线程结构性修改)以及扩容时数组拷贝的竞态条件导致数据丢失或越界。 - 延时双删的延迟时间设置:延迟时间理论上要大于”数据库主从同步的延迟时间”或”业务写操作的整体处理耗时”,确保第二次删除发生在数据已经完全落库、且可能存在的旧数据读请求已经写回缓存之后;实践中一般结合业务读写比例和监控到的实际同步延迟设置一个略有冗余的固定值(如几百毫秒到一两秒),并可以用异步延迟队列而非线程
sleep来实现,避免阻塞当前线程影响吞吐。 - RESTful 中 POST 与 GET 的语义区别:GET 是幂等且用于获取资源,请求参数暴露在 URL 中、有长度限制,且可能被缓存;POST 用于创建资源或提交非幂等操作,参数放在请求体中,不会被浏览器缓存。虽然技术上 POST 请求也能带查询参数从服务端”读取”数据,但这违反了 RESTful 语义规范,正确的资源获取动作应该用 GET。