蚂蚁一面凉经

1.自我介绍

2.解释一下线程安全和线程不安全,从内存的角度分析

【答】多个线程同一时刻对同一个资源进行读写造成预期结果与实际不一致,每个线程读取数据时都会加载内存的数据到工作空间,修改后会把工作空间的数据刷新到内存,其他线程的数据就成脏数据了,可见性没有保证。(仅供参考)

  1. 现在有一个场景如下:

(1)线程1 访问getStudentByName,线程2访问getStudentById,会不会产生锁等待【会】

(2)如果线程3访问method3,会不会与线程1和线程2产生竞争【不会】

【答】getStudentById和getStudentByName都是成员方法,锁的是Demo对象,因此会竞争

而static方法锁的是class对象

java 复制代码
public class Demo {
    public synchronized Student getStudentById(int id) {
        //get student from db
    } 

    public synchronized Student getStudentByName(String name) {
        int id = getIdByName(name);
        return getStudentById(id);
    } 
    
    public static synchronized void method3() {
        //...
    }
}
  1. Spring AOP: @After注解修饰getStudentById和getStudentByName,

当访问getStudentByName时,日志打印情况是怎样的?两个方法都会打印日志吗?先后顺序?

这题答错了。。。

【答】正确答案应该是,只有getStudentByName会打印日志,而当getStudentByName调用执行getStudentById时,不会打印日志,此时是Demo对象的调用,不是代理对象调用。

java 复制代码
public class Demo {
    @After
    public synchronized Student getStudentById(int id) {
        //get student from db
    } 
    
    @After
    public synchronized Student getStudentByName(String name) {
        int id = getIdByName(name);
        return getStudentById(id);
    } 
    
    public static synchronized void method3() {
        //...
    }
}
  1. MySQL 联合索引:有省、市、区三个字段的联合索引,判断(省、市)、(市、区)、(省、市、区)是否会走索引?为什么?

【答】最左匹配原则,必须先有省,才会匹配市,必须先有省市,才会匹配区

  1. 当数据量很大的情况,分页查询会不会越来越慢?还是很稳定?

这题答错了,囧😳,回答了不会影响,孤陋寡闻了

【答】正确答案是,当数据很大时,性能会下降,因为每次查询都需要将所有数据加载一遍,解决办法是:用子查询或联合查询将最大的ID定位到,然后where语句去查询大于等于该最大ID的记录,这样就能直接从分页查询的第一个数据开始匹配了

  1. 数据量很大时,如何设计唯一主键?

数据库自增

UUID

雪花算法

相关推荐
未秃头的程序猿5 小时前
Java 26正式发布!这3个新特性,让代码量直接减半
java·后端·面试
用户298698530145 小时前
Word 文档文本查找与替换的 Java 实现方案
java·后端
阿哉5 小时前
Nacos 服务发现源码:藏在背后的两套事件机制,90%的人只讲了一半
java
咖啡八杯5 小时前
GoF设计模式——命令模式
java·设计模式·架构
AI人工智能_电脑小能手6 小时前
【大白话说Java面试题 第125题】【并发篇】第25题:说说 Java 线程的中断机制
java·后端·面试
Java内核笔记6 小时前
Spring Security 源码解析(六)无状态 JWT 实践:Session 共享与自定义过滤器
java·后端
荣码6 小时前
LangGraph多Agent协作:3个Agent干活比1个强,但我踩了4个坑
java·python
唐青枫7 小时前
Java 虚拟线程实战指南:从 Thread API 到 Spring Boot 高并发应用
java
白鲸开源1 天前
Apache SeaTunnel Zeta Engine 的 Basic Auth 是怎么工作的?
java·vue.js·github
白鲸开源1 天前
一文读懂DolphinScheduler插件机制:如何轻松扩展任务类型与数据源
java·架构·github