字符串大小写: 针对单个字母和字符串都有区别
判断是否是2的倍数 (val & -val) == val
epoll 100% CPU Bug
mpsc
producer放入元素时,通过cas,无锁放入
consumer 不用cas判断
size()时,需要判断前后操作获取值是否相同
获得使用的 Selector 对象,不需要每次访问使用 volatile 修饰的 selector 属性
nioeventloop
run和select都有个“死”循环
run结束
shutdown
select结束
select 操作超时
若有新的任务加入
查询到任务或者唤醒。
线程被异常打断。
发生 NIO 空轮询的 Bug 后重建 Selector 对象后。
第 44 至 51 行:如果满足下面任一一个条件,结束 select :
selectedKeys != 0 时,表示有 Channel 新增的就绪的 IO 事件,所以结束 select ,很好理解。
oldWakenUp || wakenUp.get() 时,表示 Selector 被唤醒,所以结束 select 。
hasTasks() || hasScheduledTasks() ,表示有普通任务或定时任务,所以结束 select 。
那么剩余的情况,主要是 select 超时或者发生空轮询。
runAllTasks
// 每隔 64 个任务检查一次时间,因为 nanoTime() 是相对费时的操作
tailTasks 中呢?实现了批量提交写入功能的 Handler ,高并发下,对提升吞吐量有不小性能提升