记录一下字节一面的折磨历程
首先根据简历,问了项目你的分工;问了具体模块如何实现;
在存储的时候发生意外的话,如何确保数据一致性?
我的回答:给程序加锁,比如Synchronized关键字,WriteLock或者ReadLock加锁;
又问:Synchronized具体是如何实现的?这个没回答上来
Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。问:了解ReentrantLock吗?如何理解这个可重入?
概念没怎么回答上来,回答了个tryLock()与lock()的区别;又问tryLock()底层如何实现?
重入锁是指一个线程获取到该锁之后,该线程可以继续获得该锁。
底层原理维护一个计数器,当线程获取该锁时,计数器加一,再次获得该锁时继续加一,释放锁时,计数器减一,当计数器值为0时,表明该锁未被任何线程所持有,其它线程可以竞争获取锁。
为社么Java的任意对象都可以作为锁?
在Java对象头中,存在一个monitor对象,每个对象自创建之后在对象头中就含有monitor对象,monitor是线程私有的,不同的对象monitor自然也是不同的,因此对象作为锁的本质是对象头中的monitor对象作为了锁。这便是为什么Java的任意对象都可以作为锁的原因。问用过哪些数据结构?
回答:ArrayList、HashMap、HashTable
又问ArrayList底层如何实现(mad,没了解的以后不要乱说,给自己挖坑);回答了个HashMap的底层是数组+链表的形式;jdk1.8之后的改进;
又问:具体是如何存储的?时间复杂度是多少?Http和Https哪个更安全?如何加密的?为什么访问有些网站会跳出不安全的提示?
TCP三次握手
mysql是如何存储的?
回答了B+树;又问B树和B+树的区别;B+树的应用场景,回答了数据库,又问查询的时间复杂度;了解事务吗?
编程题:给一个数组,返回一个数组中和为0的数对。不能有重复。
问实现思路;回答遍历;又问能不能优化一下;回答排序,优化截止条件;
又问:能不能用常数时间查询的数据结构存储?提示了HashMap
但是没用过,最后还是用双重循环做的。
其实应该将数组的值存储在HashMap的key中,之后直接使用contains方法,查询它的相反数key。最后打印。HashMap相关,如何put,扩容,是否线程安全,为什么不安全,如何使用安全的HashMap?ConcurrentHashMap实现原理,具体如何给Segment枷锁的,每次获取size都要按顺序加锁吗
reentrantlock、Synchronized底层实现
AOP实现原理,使用场景,
知道什么引擎?有什么区别?INnoDB如何实现保证事务的特性,与MyISAM的区别,为什么数据 不存储在非叶子节点上
TCP和UDP的区别,TCP如何保证可靠性?
三次握手,四次挥手,为什么要等待2MSL,拥塞控制?
编程:sql:查询连续七天登陆的用户数量
将key之后的链表反转。
类加载机制
ArrayList扩容机制,会不会缩容
ConcurrentHashMap1.8的优化
跳表,线程池,HashMap扩容,红黑树会不会转换为链表
Synchronized,ReentrantLock
Tcp流量控制,拥塞控制