学习第18-20节
同步问题的核心三要素:原子性、可见性、有序性 锁的分类: 乐观锁(java.util.concurrent 包中的原子类)与悲观锁(Synchronized) 公平锁 new ReentrantLock (true)与非公平锁 new ReentrantLock () 共享锁与独享锁:ReadWriteLock ,其读锁是共享锁,其写锁是独享锁
Netty减少锁的对象和范围,减少锁的粒度(比如把Synchronized加到代码块而不是方法上)。 Netty减少锁对象本身的大小,减少空间占用(比如自住实现volatile的long而不是AtomicLong)。 Netty提供锁的速度,提高并行性。(比如根据jdk版本区分使用的类)。 Netty根据不同场景选择不同的并发包,因需而变。 Netty很好的衡量好锁的价值,能不用则不用锁(局部串行 + 整体并行 > 一个队列 + 多个线程模式),这样的好处是: (1)降低用户开发难度、逻辑简单、提升处理性能 (2)避免锁带来的上下文切换和并发保护等额外开销 Netty避免用锁:用 ThreadLocal 来避免资源争用,例如 Netty 轻量级的线程池实现io.netty.util.Recycler#threadLocal
1、减少对像本身大小:尽量定义类变量而非实例变量, 2、对分配内存进行预估:预知固定size避免HashMap扩容 3、Zero-Copy:使用逻辑组合、包装以及JDK的zero-copy接口,代替实际复制 4、使用堆外内存(堆heap,非堆non heap,堆外off heap) 5、使用内存池(引入对象池,开源实现Apache Commons Pool,Netty自实现轻量级内存池)
Netty中切换堆内外内存的方法 Netty中切换内存池的方法 注:内容参考极客时间相关课程
