滴滴一面二面三面面经Base杭州

Base杭州 Java开发岗位 上午10:00开始面试,下午1:30左右三面结束

一面 时长42min

自我介绍

本科和硕士学习课程的介绍

谈一下对Java的认识

JVM内存模型

输入网址后的流程介绍

套接字是什么

项目中调用一次查询接口后的流程介绍

controller和service分别负责什么

项目是前后端分离的吗,渲染用的什么技术

数据库连接池介绍及作用

Nginx和CDN介绍

Redis介绍

Redis在具体业务场景下存在的问题和解决的思路

接口幂等性的解释和你实现的方式

通过令牌保证接口幂等性过程的描述,详细问了令牌在业务中生成和删除的时间以及顺序

聊天窗口发了一段文字

MySQL表A,存储引擎InnoDB,字段id,主键id,唯一索引user_id

三个SQL语句

SQL1:select * from A where id =1

SQL2:select * from A where user_id=1

SQL3:select id from A where user_id=1

  • SQL1和SQL2性能一样吗
  • SQL3需要查询几次

B+树和B树的区别,优劣

单例的优点和缺点

分析单例在并发读和并发写下的安全性问题

手写个DLC单例

缺少第一个if语句会有什么问题

反问环节

二面 时长55min

自我介绍

实习项目业务介绍

实习过程中做的工作,中间会提出问题

描述下实习期间耗费最多精力完成的功能

本科和硕士学习过的课程(非科班的几乎都会问这个)

进程的状态

进程间通信的目的、方式

(这里说了一大堆,就是按照方式——旧方式的问题——新方式——新方式引入的问题的思路总结的)

进程间通信目的:保证先后顺序、依赖关系、消息传递

忙等互斥:

  1. 屏蔽中断:最简单,但可能导致系统终止
  2. 锁变量:0和1分别表示有无锁的状态,但是加锁引入原子性问题
  3. 严格轮训:自旋锁思想,但是过度自旋可能造成资源浪费
  4. Peterson方法
  5. TSL指令 Test and Set Lock

睡眠与唤醒: 忙等互斥没有优先级的概念,是公平的,会造成CPU的浪费

  1. sleep和wake up系统调用 唤醒未睡眠的进程导致唤醒丢失
  2. 引入唤醒等待位 但是针对多线程需要设置多个等待位

信号量:

​ 利用大于0的整形变量和down、up 的操作,通过检查信号量、更新、必要时使进程睡眠三步期间屏蔽全部中断保证原子性

互斥量:

​ 信号量的加单版本,没有计数能力,更简单有效

管程:

​ 编程语言具有的特性,不同的实现方式,感兴趣的可以另行了解

消息传递:

​ 信号量、互斥量、管程适用于单机环境,不使用与分布式环境,消息传递适用于分布式环境

屏障:

​ 针对大量进程,可以进行对进程分组,创建进程组,屏障针对进程组进行操作

面试官一直在耐心听,没有打断,很nice

虚拟内存实现原理和作用

虚拟内存实现的集中方式,分段分页和段页式

TCP中time-wait的作用

TCP为什么是可靠的连接

锁优化的过程

synchronized和reentrantlock的区别

手写一个DLC单例(没错,又写了一遍)

手写多线程:在主线程中新建一个子线程,子线程输出hello,主线程输出world,要求有先后顺序

手撕:给定一个字符串,找到这个字符串中最大的字母,在该字母后添加“(hello)”,如果有多个最大字母,就添加多次

三面 时长40min

自我介绍

实习时长为什么只有一个半月

实习项目业务介绍

难点是什么(说完了面试官古井无波的神情仿佛在对我说,就这?)

个人项目的介绍,压测时并发有多少

让你设计tomcat容器的线程数,你会考虑从什么角度去设计

(说完了面试官问还有吗,仿佛在对我说,就这?)

一系列的场景题,部分题目会在你回答完之后继续问,比如消息队列可以解决这个问题,那我现在不使用消息队列,单从数据库角度去设计,如何解决这个问题

手撕代码题

给一个十进制数,返回其转成二进制后有多少个1

写了个与操作位运算的思路,面试官问还有更好的方案吗(仿佛在对我说,就这?)
然后聊天窗口发了一段内容如下

public class P1 {

    private long b = 0;

    public void set1() {
        b = 0;
    }

    public void set2() {
        b = -1;
    }

    public void check() {
        System.out.println(b);

        if (0 != b && -1 != b) {
            System.err.println("Error");
        }
    }
}

问三个线程死循环分别执行set1、set2和check方法,控制台打印的数据会有哪些

直觉让我说了0,-1,Error都会打印,面试官问为什么,我真不知道,然后面试官还是追问要我解释,说我可以写三个死循环的子线程运行一下看看结果,说不定就知道为什么了

我从原子性和指令重排序的角度去分析,因为面试官先问了下是否了解JVM,然后才出的这道题,中间我和面试官询问是否是因为某某原因导致的问题,面试官古井无波地说你给出解释就可以。我这道题回答得一点也不好,后面就是反问环节,我直接问面试官这是JVM哪一块的知识,我回去巩固一下,面试官说就JVM前几章有提到的内容,涉及到long类型数据分两次读,赋值、判断语句中间不能保证原子性,会输出0,-1,Error和-4294967296、4294967296

分析可见http://www.voidcn.com/article/p-suizafkg-brr.html

但是复盘的时候我本地跑了一遍,输出只有0和-1,难不成是因为我的JDK版本比较新,后续修复了这个问题?这里有知道的大佬可以评论区指导一下。

class Demo {

    public static void main(final String[] args) {
        final P1 v = new P1();
        final Thread t1 = new Thread() {
            public void run() {
                while (true) {
                    v.set1();
                }
            }
        };
        t1.start();
        final Thread t2 = new Thread() {
            public void run() {
                while (true) {
                    v.set2();
                }
            }
        };
        t2.start();
        final Thread t3 = new Thread() {
            public void run() {
                while (true) {
                    v.check();
                }
            }
        };
        t3.start();
    }
}

最后另一个帖子里分享了字节杭州游戏业务部门、美团北京部门、有赞杭州部门的面经,需要的可以移步https://www.nowcoder.com/discuss/520062?toCommentId=7524630

#面经##滴滴##校招##Java工程师#
全部评论
我试了试,可能是线程太快了,被跳过去了 用System.exit(0);
点赞 回复
分享
发布于 2020-09-22 22:41
64位 jvm 环境下,long double 的read/write 操作都是一次性完成的,不会存在分高低位 read/write 的情况。知乎上有大佬给出了链接 https://www.zhihu.com/question/38816432
点赞 回复
分享
发布于 2020-09-22 23:55
滴滴
校招火热招聘中
官网直投

相关推荐

头像 头像
03-26 23:28
已编辑
嵌入式工程师
点赞 评论 收藏
转发
1 22 评论
分享
牛客网
牛客企业服务