// take, poll, peek 等读操作的方法需要获取到这个锁 private final ReentrantLock takeLock = new ReentrantLock(); // 如果读操作的时候队列是空的,那么等待 notEmpty 条件 private final Condition notEmpty = takeLock.newCondition(); // put, offer 等写操作的方法需要获取到这个锁 private final ReentrantLock putLock = new ReentrantLock(); // 如果写操作的时候队列是满的,那么等待 notFull 条件 private final Condition notFull = putLock.newCondition();
PriorityBlockingQueue
数据结构
堆
线程安全性
实现
ReentrantLock
特点
自动扩容
SynchronousQueue
特点
没有存储,读直接交给写,写直接交给读
TransferStack
TransferQueue(默认 非公平模式)
TreeSet应用场景
自动排序
线程安全性
不安全
线程安全的替代
CopyOnWriteArraySet
ConcurrentSkipListSet
重写equals四大原则,自反性,对称性,传递性,一致性,非空性
如果继承一个类,并且新增了值属性,重写equals会变得很麻烦,这时候推荐用组合
如果重写了equals但是没有重写hashcode有可能出现equals返回true但是hashcode不相等的情况
异常处理一般规范在Finally块中清理资源或者使用Try-With-Resource语句
抛出明确的异常,避免抛出Exception这种
在注释Javadoc里边添加@throws声明并且描述什么样的情况会导致异常
将异常与它的描述信息一并抛出
优先catch捕获更明确的异常
不要捕获Throwable
别忽略异常
不要打印异常日志的同时将其抛出
自定义异常包裹某个异常的同时不要丢弃它原本的信息
BIO,NIO,AIO的区别BIO
基于字节流(InputStream,OutputStream),字符流(Reader,Writer)
同步阻塞I/O操作
一个连接对应一个线程
NIO(>jdk4)
多路复用,同步非阻塞I/O操作
增加了Channel,Buffer,Selector等组件
多个连接对应一个线程
AIO(>jdk7)
异步非阻塞I/O操作
基于事件和回调机制
请求立即返回,连接和线程无对应关系
Java泛型参数