题目来源:
锐明技术 Java开发 10.25 一面 二面 凉经_牛客网 (nowcoder.com)
1.java异常机制
Java基础面试题 | 小林coding (xiaolincoding.com)
java的异常体系主要基于两大类,Throwable类及其子类。主要是Error和Exception。
Error:表示运行时环境错误。程序无法处理的严重问题
Exception:表示程序本身可以处理的异常条件
非运行时异常;运行时异常
异常处理:try,catch,finally,throw,throws
2.BIO、NIO、AIO的区别
BIO(Blocking I/O)阻塞IO
在进行I/O操作时,线程会被阻塞,直到操作完成,为每个链接创建一个线程,线程在处理请求时会被阻塞,适用于小型应用或连接数较少的场景
NIO(Non-blocking I/O)非阻塞IO
I/O操作不会阻塞线程,线程可以继续执行其他任务,直到有数据可以用或操作完成。通过Selector来监控多个通道(Cannel)的状态,适合处理大量并发连接
AIO(Asynchornous I/O)异步IO
I/O操作是异步的。线程发起请求后可继续执行其他任务,完成后通过回调机制处理结果。通过Future或Callback来处理I/O结果,不需要轮询,适合大量I/O操作并对响应时间要求较高的应用。
3.IO用了哪些设计模式
适配者模型:用于将不同的输入输出流(InputStream和OutputStream)统一到一个接口,可以处理不同的数据源
装饰器模型:例如BufferInputStream和DataInputStream,可以在不改变原有类的基础上为其添加信功能
策略模式:用于选择不同的算法或处理方式,例如不同的字符编码策略
工厂模式:用于创建各种类型的流对象
观察者模式:在某些情况下,I/O系统可能需要监听某些事件。
4..Java内存模型
java内存模型即JMM,主要解决了多线程环境下的可见性、原子性和有序性问题。
主要定义了对于一个共享变量,当另一个线程对这个共享变量执行写操作后,这个线程对这个共享变量的可见性。抽象了线程和主内存之间的关系,线程之间的共享变量必须存储在主内存中,规定了java源代码到cpu执行指令的这个转换过程的原则和规范,主要目的是为了简化多线程编程,增强程序可移植性。
happens-before原则:逻辑时钟,对分布式系统的事件的先后顺序进行判断。
happen-before原则的诞生是为了程序员和编译器、处理器之间的平衡。程序员追求的是易于理解喝编程的强内存模型,遵守规则编码即可;编译器和处理器追求的是较少约束的弱内存模型,让性能最大化。
设计思想:对编译器和处理器的约束尽可能少,只要不改变程序的执行结果(单线程和正确执行的多线程),编译器和处理器怎么进行重排序优化都行
对于会改变程序执行结果的,JMM要求编译器和处理器必须禁止这种重排序。
常见规则:
程序顺序规则:一个线程内,按照代码顺序,书写在前面的操作happens-before于书写在后面的操作
解锁规则:一个线程对某个对象的解锁操作happens-before于另一个线程对该对象的加锁操作
volatile变量规则:对一个volatile变量的写操作happen-before该变量后续的读操作
传递性:A happen-before B,且B happen-before C,那么A happen-before C
线程开始规则:对于一个线程的start()调用,happen-before该线程的如何操作
线程结束规则:对于一个线程得到所有操作,happend-before该线程的join()调用