面了1h20m,面试官看起来30多岁,有股大佬的气场。
一上来就说:先做一道编程题,然后聊一下基础,之后聊20分钟系统设计。
- 大数加法(10min,中途出了个bug面试官直接给我说出来了)
- synchronized放在静态方法和非静态方法有什么区别?(一个类锁,一个对象锁,两个锁不冲突)
- synchronized(null) 会发生什么?这个线程拿到锁还是没拿到锁?(这里有坑,面试官直接问拿到锁还是没拿到锁,我就说null没有对象,那应该是无锁)
- 你跟我讲讲synchronized锁升级过程(cas修改对象头里的markword...)
- 好,那么你再跟我说说,synchronized(null) 会发生什么?(null没有markword,cas修改markword不成功会返回false,所以无锁? ... 后来又绕了一些,我说报空指针异常,他说是。好吧...我感觉我掉坑里了)
- synchronized(Integer)会发生什么问题?(Integer在[-128,127]有缓存对象。也就是说如果两个线程都执行到synchronized(1),这两个线程会抢同一把锁。比如线程1和线程2执行不同的方法,但是因为synchronized(1)导致线程1执行时线程2没法执行)
- 线程池有coreSize和maxSize,如果coreSize=50, maxSIze=30,会创建几个线程?(我当时没注意,答曰:50)什么?再跟我说一遍?(噢噢,maxSize小于coreSize,我的天,哪有这样写的)程序员有手误的时候嘛。(我没看过源码,不知道怎么处理这种边界条件的,如果是我设计,我会选择抛异常)为什么要抛异常?不能给他创建30个线程?(这样处理是不符合用户预期的,我们要让用户及时感知到错误)
- 如果线程池coreSize = 50, maxSize = 50,会创建几个线程?(50,如果阻塞队列满了直接触发拒绝策略)
- Reentrantlock默认公平还是非公平?(非公平,因为性能好),公平锁怎么实现的?(AQS有个队列,队首是Runnable状态的线程,后面都是Waiting状态的线程,公平锁是在cas修改state之前先判断队列里是否有Waiting状态的线程,如果有就将当前线程加到队尾)
- 操作系统哪些状态?(创建,运行,就绪,阻塞,终止),运行态之后到什么状态(阻塞,不是,就绪,口误了)...(后面还说了些,不记得了)
- 操作系统死锁的条件?(互斥,占有和等待,不可抢占,循环等待,还说了如何预防)
- 1. b=1 and a=2 and d=32. c=1 and a=2 and b=33. b>1 and a=2 and c=34. a>1 and b=2 and c=35. e=1 and a=2 and c=3(a,b,c)复合索引,哪些生效?(又有坑,我又掉进去了呜呜呜... 我还没看仔细我就说只有4用到index级别的索引)我们写SQL一定要按a,b,c顺序写才能生效吗?(不是的,MySQL内部有个优化器,可以帮我们排好序)那你再跟我说说哪些生效?(噢噢,1是a和b ref级别生效...)
- HashMap线程安全,ConcurrentHashMap扩容(balabala...)
- 聊聊系统设计吧。假设这样一个场景,给你一个电梯... (大概意思就是把整个电梯数据结构设计出来,要求这些数据结构能让电梯的策略正常运转)这一部分说了很多,面试官各种挖坑:用户在2楼同时按了上下你怎么支持?用户在里面按了1,2,3,4... 你怎么支持?(分了里层和外层,里层按的用最小堆存),你电梯在2楼,往上走,你最小堆只能取1出来(噢噢,维护一个最小堆和一个最大堆,当用户按按钮的时候根据电梯当前楼层选择加到哪个堆里,当电梯上去是从最小堆里取要停的楼层,电梯下来是从最大堆里取要停的楼层) 如果这时候同时支持两个电梯...
- 反问环节:我go零基础,如果我进去之后会不会压力比较大?(还好,这边校招生和实习生也有一些转过来的,基本1-2月后就可以开始做一些小需求上线了)
总的来说,被吊锤。还是想稍微许愿一下三面的,虽然多次掉坑里了但我也算是爬出来了吧,呜呜呜...
全部评论
(20) 回帖