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。

 

posted @ 2022-02-14 00:30  方山客  阅读(22)  评论(0编辑  收藏  举报