百度提前批面经及答案

大家好,首先自我介绍一下,我是小牛, 微软 程序员一枚,秋招开始了,我和阿里,字节跳动的老哥们翻出了自个压箱底的背诵版八股文,希望对大家有所帮助。

这次面经基本都被我之前整理的大厂面试八股文涵盖了,有兴趣的同学可以到我之前的讨论贴查看我之前整理的八股文

背之前先来看看阿里巴巴常问计算机网络你们会几个

简述AQS

AQS(AbstractQuenedSynchronizer)抽象的队列式同步器。 AQS是将每一条请求共享资源的线程封装成一个锁队列的一个结点(Node),来实现锁的分配。 AQS是用来构建锁或其他同步组件的基础框架,它使用一个 volatile int state 变量作为共享资源,如果线程获取资源失败,则进入同步队列等待;如果获取成功就执行临界区代码,释放资源时会通知同步队列中的等待线程。

子类通过继承同步器并实现它的抽象方法getState、setState 和 compareAndSetState对同步状态进行更改。

AQS获取独占锁/释放独占锁原理

获取:(acquire)

  • 调用 tryAcquire 方法安全地获取线程同步状态,获取失败的线程会被构造同步节点并通过 addWaiter 方法加入到同步队列的尾部,在队列中自旋。
  • 调用 acquireQueued 方法使得该节点以死循环的方式获取同步状态,如果获取不到则阻塞。
    释放:(release)
  • 调用 tryRelease 方法释放同步状态
  • 调用 unparkSuccessor 方法唤醒头节点的后继节点,使后继节点重新尝试获取同步状态。

简述ConcurrentHashMap

JDK7采用锁分段技术。首先将数据分成 Segment 数据段,然后给每一个数据段配一把锁,当一个线程占用锁访问其中一个段的数据时,其他段的数据也能被其他线程访问。

get 除读到空值不需要加锁。该方法先经过一次再散列,再用这个散列值通过散列运算定位到 Segment,最后通过散列算法定位到元素。 put 须加锁,首先定位到 Segment,然后进行插入操作,第一步判断是否需要对 Segment 里的 HashEntry 数组进行扩容,第二步定位添加元素的位置,然后将其放入数组。

JDK8的改进

取消分段锁机制,采用CAS算法进行值的设置,如果CAS失败再使用 synchronized 加锁添加元素
引入红黑树结构,当某个槽内的元素个数超过8且 Node数组 容量大于 64 时,链表转为红黑树。
使用了更加优化的方式统计集合内的元素数量。

简述java中volatile关键字作用

  • 保证变量对所有线程的可见性。 当一条线程修改了变量值,新值对于其他线程来说是立即可以得知的。
  • 禁止指令重排序优化。使用 volatile 变量进行写操作,汇编指令带有 lock 前缀,相当于一个内存屏障,编译器不会将后面的指令重排到内存屏障之前。

为什么数据库不用红黑树用B+树

红黑树的出度为 2,而 B Tree 的出度一般都非常大。红黑树的树高 h 很明显比 B Tree 大非常多,IO次数很多,导致会比较慢,因此检索的次数也就更多。

B+Tree 相比于 B-Tree 更适合外存索引,拥有更大的出度,IO次数较少,检索效率会更高。

简述覆盖索引

覆盖索引指一个索引包含或覆盖了所有需要查询的字段的值,不需要回表查询,即索引本身存了对应的值。

简述辅助索引与回表查询

辅助索引是非聚集索引,叶子节点不包含记录的全部数据,包含了一个书签用来告诉InnoDB哪里可以找到与索引相对应的行数据。

通过辅助索引查询,先通过书签查到聚集索引,再根据聚集索引查对应的值,需要两次,也称为回表查询。

简述Atomic类基本实现原理

以AtomicIntger 为例: 方法getAndIncrement:以原子方式将当前的值加1,具体实现为:

在 for 死循环中取得 AtomicInteger 里存储的数值
对 AtomicInteger 当前的值加 1
调用 compareAndSet 方法进行原子更新
先检查当前数值是否等于 expect
如果等于则说明当前值没有被其他线程修改,则将值更新为 next,
如果不是会更新失败返回 false,程序会进入 for 循环重新进行 compareAndSet 操作。

简述JVM类加载过程

加载:

通过全类名获取类的二进制字节流.
将类的静态存储结构转化为方法区的运行时数据结构。
在内存中生成类的Class对象,作为方法区数据的入口。
验证:对文件格式,元数据,字节码,符号引用等验证正确性。

准备:在方法区内为类变量分配内存并设置为0值。

解析:将符号引用转化为直接引用。

初始化:执行类构造器clinit方法,真正初始化。

简述单例模式

一个单例类在任何情况下都只存在一个实例。 饿汉式实现
public class Singleton {
    private Singleton(){}
    private static Singleton instance 
        = new Singleton();
    public static Singleton getInstance() {
        return instance;
    }
}
懒汉式实现
public class Singleton {
    private DoubleCheckSingleton(){}
    private volatile static 
    Singleton instance;
    public static Singleton getInstance() {
        if(instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
#java求职##寒冬裁员#
全部评论
感谢老哥
点赞 回复
分享
发布于 2022-08-01 11:15
网站404了
点赞 回复
分享
发布于 2023-02-17 11:12 江苏
联易融
校招火热招聘中
官网直投

相关推荐

点赞 评论 收藏
转发
点赞 评论 收藏
转发
9 19 评论
分享
牛客网
牛客企业服务