2021-03-25

一面 7/4

没有让自我介绍

面试官特点,根据你说的东西,继续往下问。面试官:刚才你说XXX,那为什么能这样

1:进程和线程的区别 进程共享什么资源

2:volatial 如何保证可见性,数据总线?MESI?

3:TCP UDP TCP为什么是安全的,如何保证服务端和客户端数据的正确性(随机sequence num ack=seq+1)

4:hashcode 和 equals

5:Map数组长度为什是2的整数次幂 hashcode & (length-1)

6:红黑树

7:快速排序 时间复杂度

8:两个队列实现一个栈

9:线程的几个状态

10:sleep和wait的区别

11:死锁,产生死锁的条件

1,互斥条件

同一时间一个资源只能被一个任务使用

2,请求与保持条件

T1持有S1的同时,请求S2资源,但是不能立即获得(T表示任务,S表示资源)

3,不可剥夺条件

T1持有的资源无法被T2剥夺

4,循环等待条件
若干进程之间形成一种头尾相连的循环等待条件(T1拥有S1请求S2,同时T2拥有S2请求S1)

12:避免死锁

资源一次性分配:  一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反

13:虚拟内存

14:编程 两个链表数据相加(高位在前,低位在后)

​ 先将链表进行反转,再进行链表相加

总结:面试官就根据你的回答一直问下去,问到你不会为止,谨言慎行啊

二面 7/8

1:挑一个自己的项目讲一讲

2:写一个你认为最优的单例模式

3:双重检查一定能保证是单例吗(序列化,对象克隆,反射)

4:为什么要判断两次是否单例对象是否为null

 在极低的几率下,通过if (instance == NULL)的线程才会有进入锁定临界区的可能性,这种几率还是比较低的,不会阻塞太多的线程,但为了防止一个线程进入临界区创建实例,另外的线程也进去临界区创建实例,又加上了一道防御if (instance == NULL),这样就确保不会重复创建了。

5: volatile如何保证可见性 AtomicInteger如何保证原子操作

什么是缓存一致性协议呢?
每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。
volatile是两条实现原则:
1.Lock前缀指令会引起处理器缓存会写到内存
当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中
2.一个处理器的缓存回写到内存会导致其他处理器的缓存失效
处理器使用嗅探技术保证内部缓存 系统内存和其他处理器的缓存的数据在总线上保持一致。

AtomicInteger源码

private static final Unsafe unsafe = Unsafe.getUnsafe();
public final int getAndIncrement() {
    
    
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

6:垃圾回收机制(哪些可以作为根节点) HashMap数据结构

7: 场景题 如何对敏感词进行过滤 (字典树)

8:手撕代码 盛最多水的容器

猜你喜欢

转载自blog.csdn.net/YoungNUAA/article/details/115198364