来自阿里P8的灵魂拷问

本文分享了阿里P8面试中可能出现的题目,涵盖协程概念、单例模式实现、线程不安全示例、代码规范、线程池工作原理、IO模型区别、装饰者模式、JVM调优、图片大小预知及线程通讯等。面试者需深入理解并准备相关实践案例。
摘要由CSDN通过智能技术生成

今天给大家分享一些面试中可能被问到的面试题.本人也是在此次面试中受益颇多.很多问题没有回答上来.以下都是之后总结出来的.甚至还有没总结出来的.如有知道的.可以在将答案评论出来. 那么话不多聊.直奔主题了

1.什么是协程?

协程又称为微线程,是一种用户态的轻量级线程。协程不像线程和进程那样,需要进行系统内核上的上下文切换,协程的上下文切换是由程序员决定的。

2.手写单例模式

public class Singleton {

private static Singleton singleton;

private Singleton() {
}

public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}

(注意:在面试时,很有可能要求手写,比如说设计模式,线程安全模式,甚至还有画UML图的)

3.手写线程不安全示例

public class UnsafeCounter {

public int count=0;

public void add(){

    synchronized (this){
        count++;
    }

}

public  int get(){

    return count;
}


 public static  void main(String[] args) throws  Exception {
    final UnsafeCounter unsafeCounter=new UnsafeCounter();
     ExecutorService executorService = Executors.newCachedThreadPool();
     // 设置 CountDownLatch 的计数器为 100,保证在主线程打印累加结果之前,100 个线程已经执行完累加
     final CountDownLatch countDownLatch=new CountDownLatch(100);
     for (int i=0;i<100;i++){

         executorService.execute(new Runnable() {
             @Override
             public void run() {
                 unsafeCounter.add();
                 countDownLatch.countDown();
             }
         });
     }
     // 主线程等待,直到 cdl 的计数器为0
     countDownLatch.await();
     System.err.println(unsafeCounter.get());

4.代码规范有哪些

1.代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束
2.代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式
3.常量命名全部大写,单词间用下划线隔开
4.项目中避免使用DTO或者VO
5.缩进采用4个空格,禁止使用tab字符
6.单行字符数限不超过 120 个
7.获取单个对象的方法用get做前缀
8.获取多个对象的方法用list做前缀
9.获取统计值的方法用count做前缀
10.插入的方法用save(推荐)或insert做前缀
11.删除的方法用remove(推荐)或delete做前缀
12.修改的方法用update做前缀
13.所有的枚举类型字段必须要有注释,说明每个数据项的用途

(注意:这里面试官可能想看看你是不是合格的码农,所以最好说出你全知道的规范)

5.线程池工作原理

当用户进行操作时,会提交一个任务到线程池中,判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务

6.IO AO BO 的区别

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制

(注意:当时提问的时候,我都不知道这三啥玩意,面试官在你答完之后,很有可能追问,所以还需要更多的了解下)

7.说一下装饰者模式?

对已有的业务逻辑进一步的封装,使其增加额外的功能

(注意:在这里答完之后需要有手写一个案例的心里准备,不能像我靠运气)

8.JVM调优

  1. jconsole:用于对 JVM 中的内存、线程和类等进行监控;
  2. jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。
    3.jvm 调优参数设置:初始化推大小,堆最大内存,设置年轻的和老年代的内存比例,指定使用垃圾回收器组合,打印 gc 详细信息

9.下载图片时如何提前知道图片的大小

(注意:这个问题当初面试官问我的时候,是一个模拟场景,简化之后才是这样.到如今都没想出答案)

10.线程通讯有哪些

   1. 基于 volatile 关键字来实现线程间相互通
   2.使用Object类的wait() 和 notify() 方法
   3.使用JUC工具类 CountDownLatch
   4.使用 ReentrantLock 结合 Condition
   5.基本LockSupport实现线程间的阻塞和唤醒**

到了最后,我想跟大家分享一下自己总结出来的经验.我把遇到的问题分为了四种.由浅入深分别是 基础题->手写示例->画UML图->模拟场景. 由于本期给的题目较少,但是给了大家一块敲门砖.希望大家多了解一下这方面的题目. 尤其是模拟场景

谢谢大家的观看.

回答上期问题环节

什么是元问题?

元问题就是将复杂问题的拆分.我自己将它理解为"微服务",因为微服务就是将复杂的业务逻辑拆分为可以独立运行的简单服务.在代码如此,生活中遇到问题也可以这样解决问题

麦肯锡的MEMC法则?

将问题拆解到底,他们是相互独立的并且完全穷尽.通俗来讲,找到一个问题所有的答案,一定要保证所有的假设情况都在我们的考虑当中.然后对症下药

本期问题环节

你在项目中遇到过最困难的问题是什么?怎么解决的?

你在项目中曾最吸印你的地方是什么?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值