首页 > 笔经面经 > 百度云社招java 二面

百度云社招java 二面

头像
June1993
编辑于 2019-12-31 18:46:34 APP内打开
赞 1 | 收藏 70 | 回复3 | 浏览4155

首先还是怼项目。问的比较细,有时候面试官会把条件改下,问假如现在需要你实现这个功能,你怎么来实现?
中间也会穿插一些中间件和基础原理的问题。
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远程调试的原理:这个真不知道。。。有知道的可以说下。

3条回帖

回帖
加载中...
话题 回帖

相关热帖

笔经面经近期热帖

近期精华帖

热门推荐