阿里盒马鲜生Java工程师一面面经(7.30投递)
一面(8.13,30min)
1. 自我介绍
2. 项目讲解
3. 平时数据库你是怎么去维护的?你觉得需要注意的指标有哪些?
3. OSI七层模型
4. TCP在哪一层?TCP和UDP的区别?
5. 进程、线程、协程之间的关系,什么是守护线程?
联系:一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。
线程有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。
协程是一种用户态的轻量级线程,协程的调度完全由用户程序控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
守护线程:在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) ,只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。守护线程最典型的应用就是 GC (垃圾回收器)。
6. 进程间的通信方式以及线程之间的通信方式 ?
进程之间的通信方式:1. 共享内存 2. 管道 3. 消息队列 4. 信号量 5. 套接字 6. 信号
线程之间的通信方式:1. 使用volatile关键字 2. 使用synchronized配合wait()和notify() 3. JUC工具类CountDownLatch(闭锁) 4. 使用ReentrantLock结合Condition 5. BlockingQueue阻塞队列
7. 介绍一下Java中的集合(List,Set,Map)
8. HashMap的老八股, 如果是一个Object作为hashMap的key的话这个对象需要满足什么条件?
Hashmap不允许有重复的key,所以要重写它的hashcode和equals方法,以便确认key是否重复。重写hashCode()是因为需要计算存储数据的存储位置,重写equals()方法目的是为了保证key在哈希表中的唯一性。
9. concurrentHashMap为什么使用分段锁?分段锁的概念?为什么1.8去除了Segement,有什么好处?
10. ACID特性、隔离级别以及脏读不可重复读和幻读
11. 数据库底层事务的隔离性怎么实现的?
数据库的隔离级别有四种
1. 读未提交 2. 读已提交 3. 可重复读 4. 串行化
1. 读未提交:顾名思义,一个事务读取到了另一个事务还未提交的数据
该隔离级别读未加锁,但写加了X锁
2. 读已提交 3. 可重复读
这两个隔离级别在数据库中使用了MVCC多版本并发控制,但MVCC只对读操作有效,对写操作无效,防止不了幻读。
读已提交能够防止脏读是因为MVCC会在事务每一次执行查询语句时生成一个Read View,Read View会排除读取在查询之前的数据,也就防止了脏读,当不能避免不可重复读。
可重复读能够防止不可重复度是因为MVCC会在事务第一次执行查询语句时只生成一个Read View,Read View会排除读取在该事务版本号之前的数据,也就实现了可重复读。
4. 串行化
普通的select语句都会转化为select ... lock in share mode 也就是加了S锁,必须等读语句执行完才能对数据进行修改,这也是为什么串行化能防止幻读的原因
12. 数据库索引底层的B+树结构以及为什么这样设计的原因?
13. 找出字符串中字符出现的次数。
笔试挂了
😅😅😅😅#盒马2021校园招聘##面经##校招##盒马##Java工程师#