• java面试题记录


     一、多线程、高并发:

    1.1 什么是死锁,怎样解决死锁问题?

    死锁指的是由于两个或两个以上的线程互相持有对方所需要的资源,同时等待获取对方释放自己所需要的资源,导致这些线程处于等待中而无法往下进行的状态。

    精简描述:死锁是指多个线程因竞争资源而造成的一种互相等待的僵局。
    .
    死锁的四个必要条件:
    (1)互斥性:一个资源只能被一个线程占有;
    (2)请求和保持条件:一个线程对请求被占有资源发生阻塞时,对已经占有的资源不释放;
    (3)不剥夺:一个线程在释放资源之前,其他的线程无法剥夺占用;
    (4)循环等待:发生死锁时,线程进入死循环,永久阻塞;
    .
    死锁的解决方案:

    (1)注意加锁顺序。
    (2)申请资源前,释放自己拥有的资源;
    (3)死锁检测

    1.2 谈谈你对 Synchronized 的理解

    Synchronized解析——如果你愿意一层一层剥开我的心 - 掘金synchronized,是解决并发情况下数据同步访问问题的一把利刃。那么synchronized的底层原理是什么呢?下面我们来一层一层剥开它的心,就像剥洋葱一样,看个究竟。 接下来,我们先剥开synchronized的第一层,反编译其作用的代码块以及方法。 由图可得,添加了s…icon-default.png?t=N7T8https://juejin.cn/post/6844903918653145102#comment

     

     二、java IO

    2.1 Java中常见的I/O模型 ?

    (1)BIO(Blocking I/O)同步阻塞I/O模型

            BIO是Java早期提供的IO模型。它是一种阻塞式IO,在进行IO操作时,线程会被阻塞直到IO操作完成。

            Java IO通过流的方式来进行IO操作,对应的主要类包括InputStream、OutputStream、Reader和Writer,它们是同步的,一次只能处理一个请求。在面对并发量较大的情况下,BIO模型性能较低。

         BIO缺点:

    1. 无法处理过高的并发请求
    2. 数据读写操作过程中线程阻塞、资源占用
    (2)NIO(Non-Blocking I/O)同步非阻塞IO
            NIO有两种实现方式:

            第一种实现方式 (早期实现):一个线程无限循环去list(存放着客户端连接)轮训,检查是否有读写请求,如果有则处理,如果没有跳过;属于同步非阻塞I/O模型。

    缺点:如果连接过多,会有大量的无效遍历(因为每个连接不一定都有读写事件),造成资源浪费。

            第二种实现方式(JDK1.4 后):客户端发送的连接请求都会注册到多路复用器selector上,多路复用器轮询到连接有IO请求就进行处理;属于I/O 多路复用模型。

    (3) (I/O Multiplexing)  IO多路复用

            实际上就解决了 NIO 中的频繁轮询 CPU 的问题,并且引入一种新的 select 系统调用。

    复用 IO 的基本思路就是通过 slect 调用来监控多 fd(文件描述符),来达到不必为每个 fd 创建一个对应的监控线程的目的,从而减少线程资源创建的开销。一旦某个描述符就绪(一般是内核缓冲区可读/可写),内核就能够将文件描述符的就绪状态返回给用户进程(或者线程),用户空间可以根据文件描述符的就绪状态进行相应的 IO 系统调用。IO 多路复用(IO Multiplexing)属于一种经典的 Reactor 模式实现,有时也称为异步阻塞 IO

    (4)AIO(Asynchronous I/O)是异步I/O模型

            异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

    特点:

    1. 异步操作:在AIO中,I/O操作会在后台进行,不会阻塞程序的执行。当一个I/O操作被发起后,程序可以继续执行其他任务,而不需要等待操作完成。

    2. 回调机制:当I/O操作完成时,系统会通知程序,触发事先注册的回调函数。通过回调函数,程序可以获取操作结果或执行后续处理。

    3. 缓冲区管理:在AIO中,数据的读取和写入使用缓冲区。程序将数据写入缓冲区后,可以继续执行其他任务,而不需要等待数据的实际写入操作完成。

    (5) 信号驱动I/O

            

    当进程发起一个 IO 操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用 IO 读取数据。

    信号驱动 IO 不同于 AIO 的是依旧存在阻塞状态,即用户进程获取到数据就绪信号后阻塞进行 IO 操作。

    三、关系型数据库,如 MySql 等 数据库 

    四、非关系型数据库,redis数据库 

    五、rabbitMQ 等消息中间件 

     六、设计模式

     6.1 项目中使用过哪些设计模式?举例场景 及遇到的实际问题

    七、spring 、springMVC  、springBoot、springCloud 框架的理解

  • 相关阅读:
    Leetcode121-买卖股票的最佳时机
    2021年PHP-Laravel面试题问卷题 答案记录
    论文阅读 6 | Bayesian Meta-Learning for the Few-Shot Setting via Deep Kernels
    串口通信问题排查总结
    杰理之CMD_SET_BT_ADDR【篇】
    5.DApp-前端网页怎么连接MetaMask
    SHIB去零计划:创新金融未来,打造稳定数字资产新范式
    使用GitHub Actions和GitHub pages实现前端项目的自动打包部署
    RK3588 开发者选项中通过“USB DEBUG“按钮实现otg模式切换(二)
    欧科云链研究院:30年期美债收益率破5%,高利率环境会维持多久?
  • 原文地址:https://blog.csdn.net/xiaoye3708/article/details/132841606