ssingularity的个人日志

怕什么真理无穷,进一步有进一步的欢喜

Netty源码阅读8——FastThreadLocal

在ThreadLocal实现中,为了防止多线程对于内置Map<ThreadId, Object>的并发访问带来的性能损耗以及加锁问题,ThreadLocal采用了相反的方式,将对应的Map<ThreadId,Object>转化为了Map<ThreadLocalId,Ob

Netty源码阅读7——内存管理

概述Netty需要自己管理内存的原因:1. 在Netty中往往会有大量的ByteBuf被创建出来,在jvm中new一个对象的开销挺大的——需要依次检查类,链接,分配内存,初始化初始值,记录对象头等,其中主要是分配内存(当Heap不够时要调用malloc,另外要寻找内存分配以及并发处理)和初始化初始值

MySQL事务隔离机制

MySQL在底层使用共享锁、排他锁以及区间锁去实现不同的事务隔离等级(Read Committed对于读上读锁然后马上放锁,对于写则上写锁一直到事务结束;Repeatable Read对于读上读锁,对于写上写锁一直到事务结束;Sequential则三个锁都上),其中为了进一步提升性能,在Read C

Netty源码阅读6——Write And Flush

内核管理的每一个TCP文件描述符都有一个读缓冲区和一个写缓冲区在BIO的情况下,当读缓冲区为空时,Socket.read会一直阻塞,当写缓冲区满了时,Socket.write会一直阻塞,这里需要注意的是,所有的读和写不是针对NIC(网卡)的,而是针对内核管理的TCP文件描述符的缓冲区的,而NIO对于

Netty源码阅读5——Pipeline

Pipeline是一个链式结构,pipeline中的每个节点是一个ChannelHandlerContext对象,每个context节点保存了它包裹的执行器 ChannelHandler ,节点之间通过双向链表连接在创建一个Pipeline的时候会创建对应的HeadContext以及TailCont

Netty源码阅读4——连接建立

NioServerSocketChannel本质上也是通过调用read方法进行连接的建立以及NioSocketChannel的创建与注册的,只是与NioSocketChannel的read方法相比较,前者传输的参数的具体类型是NioSocketChannel,而后者传输的参数的具体类型是ByteBu

Netty源码阅读3——服务端启动

服务端的启动入口是在ServerBootstrap#bind()方法上,其他只是通过链式方法设置了对应的参数,在bind方法中先对于设置的参数进行校验,然后调用doBind()方法,触发真正的启动private ChannelFuture doBind(final SocketAddress loc

Netty源码阅读2——NioEventLoop执行过程

NioEventLoop的执行过程抽象如下:for (;;) { select(wakenUp.getAndSet(false)); if (wakenUp.get()) selector.wakeup(); processSelectedKeys(); runAllTa

Netty源码阅读1——NioEventLoopGroup创建过程

NioEventLoop以及NioEventLoopGroup的继承结构如下:一般Netty中通过调用NioEventLoopGroup(int nThreads)方法构造一个并NioEventLoopGroup并随之创建多个NioEventLoop同时存在对应的数组之中,其中需要注意的细节如下:1

跳表——Skip List

跳表对标的是平衡树,是一种插入、删除、搜索都是O(logn)的数据结构,由于其原理简单、容易实现因此在非常多的项目中,如:redis、levelDB都是用跳表来替代平衡树跳表处理的都是有序的链表,它在有序链表的基础上,给每个节点加上了层级的概念,比如3层的节点除了指向下一个1层的节点之后还会指向下一