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

相关推荐

03-21 11:43
已编辑
东莞理工学院 Java
春招面试复盘:滴滴二面失利,败于代码设计感与架构思维这次滴滴面试整体氛围很友好,全程没有八股文拷问,面试官全程围绕实习经历深挖细节,这部分我因为反复梳理过,回答得都比较顺畅,整体发挥稳定。一面主要考察项目拓展与细节落地,算法题也相对常规,手撕了多线程交替打印1234和三数之和,顺利通关进入二面。本以为稳扎稳打能走到最后,却在二面的手撕环节栽了跟头,也是这次失利的核心原因。二面面试官没有出常规算法题,而是让我手写一个优惠券发放API,要求实现优惠券发放、库存扣减等核心功能。刚看到题目时我愣了一两秒,随后便按照算法题的解题思路,直接上手写Controller层,把防重复校验(订单号)、防超卖(CAS+库存判断)、try-catch异常兜底等逻辑,全部堆砌在了Controller里。当时我还觉得考虑得全面逻辑通顺,自认为这部分作答没问题。直到反问环节,我询问面试官对候选人的核心期望,对方直接点明:希望写代码更有设计感,具备架构思维,先拆分逻辑再动手,而非一上来就直接堆砌代码。我瞬间明白,这正是在指出我的问题。复盘下来,我不仅把所有业务逻辑耦合在Controller层,没有做工程化的分层拆分,加上英语基础薄弱,部分变量用拼音命名,代码可读性和规范性大打折扣。即便功能逻辑实现了,但整体缺少架构分层、模块解耦的设计思维,完全是算法题的写法,而非真实业务开发的规范思路。面试结束仅十分钟就收到感谢信,结果来得猝不及防,也让我彻底认清了问题所在。如果重来一次,我一定会先梳理架构,拆分Controller、Service、DTO等层级,先规划模块、写好注释,再逐步实现逻辑,而非上来就埋头写代码。这次滴滴二面面试官要求确实更偏工程化与架构能力,而我用算法题的固化思维应对非常规业务手撕题,即便逻辑正确,也没能达到面试官的标准。接连的面试失利,也让我深刻体会到,春招卷学历、卷背景的大环境下,纯靠逻辑正确远远不够,工程化思维、代码设计感、架构意识这些软实力,才是决胜的关键,作为普通院校应届生,短板真的会被无限放大,这条路走得实在又累又难。
查看2道真题和解析
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
04-09 23:35
点赞 评论 收藏
分享
评论
1
23
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务