2020/12/4 10:00 20min
面试官提前一分钟打电话过来,这么敬业的小哥哥,我还是第一次遇到😂,简单聊了几句就开始面试了。
1.自我介绍
2.看你简历写的技术点挺多的,你说一下你比较擅长的?
3.看你用 Netty 做过 RPC 框架,你能说说 Netty 是什么吗?
4.Netty 的异步体现在什么方面?
一是异步事件处理,Event 被放入 EventQueue 即可返回,后续再从 Queue 里消费处理;
二是异步 IO,包括 bind、write 等操作会返回一个 ChannelFuture,进而异步拿到结果,不会造成线程 block。
serverBootstrap.bind(port).addListener(future -> { if (future.isSuccess()) { System.out.println("success, port: " + port); } else { System.out.println("failed, port: " + port); } });
5.你知道非阻塞 IO 吗?讲一下流程?
6.阻塞 IO 呢?讲一下流程?
7.谁来读数据?
8.谁通知它来读数据?
9.从哪里读数据?
10.MySQL 索引的 B+ 树说一下,为什么不用 B 树?
11.你对 volatile 关键字的了解?
12.你说 volatile 修饰 64 位变量可以保证原子性,如果不加 volatile 会怎样,说一下例子?
当线程在没有同步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值。这种安全性保证也被称为最低安全性(out-of-thin-air safety)。
最低安全性适用于绝大多数变量,但是存在一个例外:非 volatile 类型的 64 位数值变量(double 和 long),Java 内存模型要求,变量的读取操作和写人操作都必须是原子操作,但对于非 volatile 类型的 long 和 double 变量,JVM 允许将 64 位的读操作或写操作分解为两个 32 位的操作。当读取一个非 volatile 类型的 long 变量时,如果对该变量的读操作和写操作在不同的线程中执行,那么很可能会读取到某个值的高 32 位和另一个值的低 32 位。因此,即使不考虑失效数据问题,在多线程程序中使用共享且可变的 long 和 double 等类型的变量也是不安全的,除非用关键字 volatile 来声明它们,或者用锁保护起来。——《Java并发编程实战》
13.你刚才说可见性,具体说一下,不加 volatile 的话,什么时候才能读到主内存的值?
不加 volatile 的变量没有改动时读工作内存,有改动时读主内存。
14.你对死锁的了解?一个线程获取锁,在代码层面是怎么实现的?
反问:
1.部门是做什么的?
2.实习生多久可以上手写需求?
3.面试结果什么时候能出来?
总结:
面试官还是比较和蔼的,对知识问的比较深,有一些问题没有答好,面试官也有了提示,是一次收获很大的面试。
全部评论
(10) 回帖