2022.02.13 周日 阴
一、Java IO
1. BIO:同步阻塞。Writer和Reader,适用于字符流;OutputStream和InputStream,适用于字节流。
2. NIO:同步非阻塞,面向缓冲区,多路复用。组件:Selector, Channel, Buffer。一个Selector对应
一个线程以及多个Channel,一个Channel对应一个Buffer。基于Event驱动来选择Channel。适用于
连接数较多且连接较短的场景,比如聊天服务器、弹幕系统。
3. AIO:异步非阻塞。适用于连接数较多且连接较长的场景。比如相片服务器。
二、Java异常
1. 直接上图(网图)
这里RuntimeException及其子类也被称作非受检异常,不应试图捕获,很可能是代码逻辑有问题导致
(常见的非受检异常我们先记住这三个ClassCastException、IndexOutOfBoundsException、
NullPointerException)。
除此之外的异常被称作受检异常,如果不写try catch的话,编译器会报错(常见的受检异常记住这三个
ClassNotFoundException、InterruptedException、IOException)
2. 多重catch子句,会先匹配第一个catch,匹配不上依次往后匹配。
三、java多线程
1. sleep和wait的区别
(1) sleep是Thread类的方法,不会释放锁。wait是Object类的方法,会释放锁。
(2) wait、notify、notifyAll 只能在代码同步块中使用。sleep可以在任何地方使用。
(3) wait/notify被用来进行线程通信,而sleep被用来暂停线程。
(4) sleep需要捕获异常,wait不需要
注意:被唤醒的线程会进入就绪队列而不是立马获得资源
2. ThreadLocal
(1) 使用内部类ThreadLocalMap来存放数据。ThreadLocalMap中的key是弱引用,当不存在外部强引用的
时候,就会自动被回收。但是Entry中的value依然是强引用。所以需要主动去remove释放value的内存。
(2) 如何实现单个线程可见?set的时候先获取当前线程的实例,获取它的ThreadLocalMap,没有获取到则
新建ThreadLocalMap,然后去这个map里set值;get的时候也是先获取当前线程实例,再获取它的thread
localmap的值。
(3) ThreadLocalMap使用线性探测法处理hash冲突
3. join
(1) join是Thread的方法
(1) join顾名思义,加入、参与的意思。B线程里调用A线程的join方法,意思A参与进来了,A插队先执行,B歇
歇神,等A完了你B再继续。所以join的作用就是,使并行的程序变成串行。
(2) A.join(10)表示B只会让A先执行10ms。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构