做者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人php
百度云java社招一面面经与我的总结
一、首先是项目部分,问的比较细。这部分没什么参考价值,忽略。
二、若是一个对象有多个方法加了synchronized,那么该对象有几把锁
对象锁是在一个类的对象上加的的锁,只有一把,无论有几个方法进行了同步。
这些同步方法都共有一把锁,只要一个线程得到了这个对象锁,其余的线程就不能访问该对象的任何一个同步方法。
3.NIO与AIO的区别以及各自的做用
Java NIO :同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的链接请求都会注册到多路复用器上,多路复用器轮询到链接有I/O请求时才启动一个线程进行处理。
Java AIO(NIO.2) :异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,
NIO方式适用于链接数目多且链接比较短(轻操做)的架构,好比聊天服务器。
AIO方式使用于链接数目多且链接比较长(重操做)的架构,好比相册服务器。
4.IOC的实现原理
Spring的IOC实现原理就是工厂模式加反射机制,通俗来说就是根据给出的类名(字符串方式)来动态地生成对象,这种编程方式可让对象在生成时才被决定究竟是哪种对象。
把IOC容器的工做模式看作是工厂模式的升华,能够把IOC容器看做是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,而后利用编程语言提供的反射机制,根据配置文件中给出的类名生成相应的对象。
Spring支持三种依赖注入方式,分别是属性(Setter方法)注入,构造注入和接口注入。
五、反射的原理
反射首先是可以获取到Java中的反射类的字节码,而后将字节码中的方法,变量,构造函数等映射成 相应的 Method、Filed、Constructor 等类
六、数据库调优思路的思路。
1).慢查询的开启并捕获
2).explain+慢sql分析
3).show profile查询sql在mysql服务器里面的执行细节和生命周期状况
4).sql数据库服务器的参数调优
七、开放性的问题,如何提升系统QPS。
这个问题我感受大体能够从这几个方面
1)、单机版能承受并发的能力是有限的,咱们能够进行系统拆分,分开部署在不一样的机器上。
2)、用消息队列削峰。系统不至于由于瞬间的流量挂掉。而且能够配合使用限流与服务降级。
3)、用redis什么的作缓存。
4)、数据库分库分表,创建合适的索引。java
百度云java社招二面面经与我的总结
首先仍是怼项目。问的比较细,有时候面试官会把条件改下,问假如如今须要你实现这个功能,你怎么来实现?中间也会穿插一些中间件和基础原理的问题。
一、redis作分布式锁怎么作的?
先拿setnx来争抢锁,抢到以后,再用expire给锁加一个过时时间防止因为程序crash等缘由没有释放。最后线程操做结束以后,释放分布式锁。
二、Redis能作分布式锁的原理?
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的链接并不存在竞争关系。
三、JUC下面主要用哪些东西?
CountDownLatch、Cyclicbarrier 。。。。。等等。其核心是AQS
四、说一下AQS?
AQS是JUC中不少同步组件的构建基础,简单来说,它内部实现主要是状态变量state和一个FIFO队列来完成,同步队列的头结点是当前获取到同步状态的结点,获取同步状态state失败的线程,会被构形成一个结点(或共享式或独占式)加入到同步队列尾部(采用自旋CAS来保证此操做的线程安全),随后线程会阻塞;释放时唤醒头结点的后继结点,使其加入对同步状态的争夺中。mysql
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
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
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
百度云java社招三面面经与我的总结
项目部分就不具体说了。问了怎么排查问题,都遇到哪些难题什么的。
一、redis分布式锁如何保证原子性?
能够了解下这个命令:set key value [EX seconds] [PX milliseconds] [NX|XX]redis
二、用过ThreadLocal吗?简单说一下?
ThreadLocal采用的是以空间换时间的方式,为每一个线程提供一份变量副本。每个线程均可以独立的改变本身的副本。具体例子能够本身去网上找。
三、Java8以后的ConcurrentHashMap, 舍弃分段锁
经过 JDK 的源码和官方文档看来, 他们认为的弃用分段锁的缘由由如下几点:
1)加入多个分段锁浪费内存空间。
2)生产环境中, map 在放入时竞争同一个锁的几率很是小,分段锁反而会形成更新等操做的长时间等待。
3)为了提升 GC 的效率。
四、介绍下cms收集器
CMS收集器是老年代收集器,能够配合新生代的Serial和ParNew收集器一块儿使用。使用的是标记清除算法,容易产生内存碎片。
4个步骤:1.初始标记--》并发标记--》从新标记--》并发清除 (初始标记、从新标记)仍需STW。但初始标记仅仅只标记了一下GC Roots能直接关联到的对象,速度很快。
而从新标记则是修正并发标记期间因用户程序继续运行而致使标记产生变更的那一部分对象的标记记录,虽然通常比初始标记阶段稍长,但要远小于并发标记时间。算法
五、redis缓存与数据库一致性问题?
一致性问题主要出如今数据更新的时候,一般在更新时采起删除缓存而不是更新缓存。
具体一点?先淘汰缓存,再写数据库。由于若是先写数据库可能出现若是有读请求发生,可能致使旧数据入缓存,引起数据不一致。sql
六、dubbo有哪几种负载均衡策略?
1.RandomLoadBalance:按权重随机调用,这种方式是dubbo默认的负载均衡策略
2.RoundRobinLoadBalance:轮询,按公约后的权重设置轮询比率
3.LeastActiveLoadBalance:最少活跃次数
4.ConsistentHashLoadBalance:一致性hash
5.自定义负载均衡策略数据库
七、介绍下一致性hash?
先说下普通hash有机器宕机或者新加机器的后果。而后
介绍一致性hash。
hash值是个整数非负数值,全部的hash值造成一个闭圆环
对集群的的节点的某个属性求hash值,放到环上
数据key求hash值,也放到环上。
数据的hash值按顺时针找到离它最近的节点,放在该节点上。编程
八、介绍下mysql的回表和覆盖索引?
回表简单来讲就是数据库根据索引(非主键)找到了指定记录所在行后,还须要根据主键再次到数据库里获取数据。
若是一个索引包含(或覆盖)全部须要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。
九、说下模板方法模式?
所谓模版方式模式:把不变的行为搬到超类,去除子类中重复的代码来体现他的优点;当不变的和可变的行为在子类实现中混合在一块儿的时候,
不变的行为就会在子类中重复实现,咱们经过模板方法模式把这些行为搬移到单一的地方,这样就能够帮助子类摆脱重复不变行为的纠缠。
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,能够长按关注一下:
长按订阅更多精彩▼
若有收获,点个在看,诚挚感谢