百度云社招java 二面
首先还是怼项目。问的比较细,有时候面试官会把条件改下,问假如现在需要你实现这个功能,你怎么来实现?
中间也会穿插一些中间件和基础原理的问题。
redis做分布式锁怎么做的?
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止由于程序crash等原因没有释放。最后线程操作结束之后,释放分布式锁。
Redis能做分布式锁的原理?
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。
JUC下面主要用哪些东西?
CountDownLatch、Cyclicbarrier 。。。。。等等。其核心是AQS
说一下AQS?
AQS是JUC中很多同步组件的构建基础,简单来讲,它内部实现主要是状态变量state和一个FIFO队列来完成,同步队列的头结点是当前获取到同步状态的结点,获取同步状态state失败的线程,会被构造成一个结点(或共享式或独占式)加入到同步队列尾部(采用自旋CAS来保证此操作的线程安全),随后线程会阻塞;释放时唤醒头结点的后继结点,使其加入对同步状态的争夺中。
AQS为我们定义好了顶层的处理实现逻辑,我们在使用AQS构建符合我们需求的同步组件时,只需重写tryAcquire,tryAcquireShared,tryRelease,tryReleaseShared几个方法,来决定同步状态的释放和获取即可,至于背后复杂的线程排队,线程阻塞/唤醒,如何保证线程安全,都由AQS为我们完成了,这也是非常典型的模板方法的应用。AQS定义好顶级逻辑的骨架,并提取出公用的线程入队列/出队列,阻塞/唤醒等一系列复杂逻辑的实现,将部分简单的可由使用者决定的操作逻辑延迟到子类中去实现。
网上很多博客,不了解的可以去找找看。
*ReentrantLock非公平锁和公平锁的实现原理? *
final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); //获取同步状态 if (c == 0) { //如果同步状态为0,表明没有线程获取锁,或者队列中的节点正在获取锁。 //此时非公平锁会直接去尝试获取锁。 if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { //公平锁的话。会先判断队列中是否有等到的线程 if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
说下MVCC?数据库调优的思路?
在读已提交的级别下,都会通过MVCC获取当前数据的最新快照,不加任何锁。存在的问题:在每次select之间有其他事务更新了我们读取的数据并提交了,那就出现了不可重复读。可重复读:MVCC版本的生成时机,
即:一次事务中只在第一次select时生成版本,后续的查询都是在这个版本上进行,从而实现了可重复读。
1.慢查询的开启并捕获 2.explain+慢sql分析 3.show profile查询sql在mysql服务器里面的执行细节和生命周期情况 4.sql数据库服务器的参数调优。
kafka怎么保证消息的顺序性?zookeeper的选举原理?
这个可以自己百度一下,网上很多。
Java远程调试的原理:这个真不知道。。。有知道的可以说下。
#社招##百度##Java工程师##面经#