2021大厂Java面试真题(二)

2021 【阿里】面试真题

1、TCP 和 UDP 区别?

  • TCP 基于连接,UDP 基于无连接。

  • TCP 要求系统资源较多,UDP 较少。

  • UDP 程序结构较简单。

  • TCP 保证数据正确性,UDP 可能丢包。

  • TCP 保证数据顺序,UDP 不保证。

2、TCP/IP 协议涉及哪几层架构?

应用层 传输层 互连网络层 网络接口层。

3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手?

因为 TCP 是全双工,每个方向都必须进行单独关闭。关闭连接时,当 Server 端收到 FIN

报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉 Client

端,”你发的 FIN 报文我收到了”。只有等到 Server 端所有的报文都发送完了,我才能发

送 FIN 报文,因此不能一起发送。故需要四步握手。

4、计算机插上电源操作系统做了什么?

  • 加电––––打开电源开关,给主板和内部风扇供电。

  • 启动引导程序––––CPU 开始执行存储在 ROM BIOS 中的指令。

  • 开机自检––––计算机对系统的主要部件进行诊断测试。

  • 加载操作系统––––计算机将操作系统文件从磁盘读到内存中。

  • 检查配置文件,定制操作系统的运行环境––––读取配置文件,根据用户的设置对操作

系统进行定制。

  • 准备读取命令和数据––––计算机等待用户输入命令和数据。

5、Linux 操作系统设备文件有哪些?

字符设备、块设备。

6、多线程同步有哪些方法?

  • 使用 synchronized 关键字

  • wait 和 notify

  • 使用特殊域变量 volatile 实现线程同步

  • 使用重入锁实现线程同步

  • 使用局部变量来实现线程同步

  • 使用阻塞队列实现线程同步

  • 使用原子变量实现线程同步

7、一个对象的两个方法加 synchronized,一个线程进去 sleep,另一个线程 可以进入到另一个方法吗?

不能。

8、什么是可重入锁(ReentrantLock)?

举例来说明锁的可重入性

public class UnReentrant{

Lock lock = new Lock();

public void outer(){

lock.lock();

inner();

lock.unlock();

}

public void inner(){

lock.lock();

//do something

lock.unlock();

}

}

outer 中调用了 inner,outer 先锁住了 lock,这样 inner 就不能再获取 lock。其实调用

outer 的线程已经获取了 lock 锁,但是不能在 inner 中重复利用已经获取的锁资源,这种

锁即称之为不可重入可重入就意味着:线程可以进入任何一个它已经拥有的锁所同步着的代码

块。

synchronized、ReentrantLock 都是可重入的锁,可重入锁相对来说简化了并发编程的开发。

9、创建线程的三个方法是什么?

  • 通过继承 Thread 类创建线程类。

  • 实现 Runnable 接口创建线程类。

  • 通过 Callable 和 Future 接口创建线程。

10、Java 怎么获取多线程的返回值?

  • 主线程等待。

  • 使用 Thread 的 join 阻塞当前线程等待。

  • 实现 Callable 接口(通过 FutureTask 或线程池的 Future)。

11、线程池有哪几种创建方式? Java 通过 Executors(jdk1.5 并发包)提供四种线程池,分别为:

  • newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵

活回收空闲线程,若无可回收,则新建线程。

  • newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队

列中等待。

  • newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

  • newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执

行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

12、线程池参数有哪些?

  • corePoolSize 核心线程大小。

  • maximumPoolSize 线程池最大线程数量。

  • keepAliveTime 空闲线程存活时间。

  • unit 空间线程存活时间单位。

  • workQueue 工作队列。

  • threadFactory 线程工厂。

  • handler 拒绝策略。

13、线程池拒绝策略有哪些?

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常

(默认拒绝策略)。

  • ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。

  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被

拒绝的任务。

  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务。

14、你认为对线程池的核心参数实现自定义可配置,三个核心参数是?

  • corePoolSize : 核心线程数线程数定义了最小可以同时运行的线程数量。

  • maximumPoolSize : 当队列中存放的任务达到队列容量的时候,当前可以同时运行的线

程数量变为最大线程数。