06 2021 档案
摘要:一、设计原则 单一职责:一个类负责一类功能 开闭原则:对扩展开放,对修改封闭 里氏代换原则:所有使用父类的地方,都可以使用子类替换 依赖倒转:具体依赖抽象。两个关联的东西,都应该在外层有一个抽象封装,这样只需要修改内部实现,不影响关联。针对接口编程 接口隔离原则:一个接口负责一个功能 合成复用原则:
阅读全文
摘要:在Netty中,跟ThreadLocal做用很类似的类。配套使用的还有InternalThreadLocalMap,它对应ThreadLocalMap、FastThreadLocalThread,它对应Thread。对ThreadLocal不熟悉的小伙伴可以参考第三章 对象的共享中的对应部分。我们一
阅读全文
摘要:方法1: a & (a-1) == 0,画图就能理解 方法2: 这个是在看netty源码的时候发现的,DefaultEventExecutorChooserFactory#isPowerOfTwo(int val) (a & -a) == a,-a二进制的计算方式是,a的二进制取反,再加1,画图方便
阅读全文
摘要:synchronized是jdk中的关键字,保证了原子性、可见性、有序性。本文主要探讨可见性的相关问题。可见性是指一个线程对共享变量的修改,是否对其他线程可见。JMM中规定了,lock操作会从主存中刷新最新共享变量的值到工作线程,而unlock会将工作线程中的值同步会主存。所以synchronize
阅读全文
摘要:之前读CHM的源码(JDK8),其中有一段印象比较深,它内部有一个Node数组,volatile修饰, transient volatile Node<K,V>[] table; 。而Node对象本身,存储数据的val变量,也是用volatile修饰的。这两个一个是保证扩容时,变更table引用时的
阅读全文
摘要:参考自这篇文章:LFU五种实现方式,从简单到复杂,实现了其中第五种方法。 数据结构如下: 1. DoubleLinkedList 每个节点代表不同的频次,按照从高到低的顺序。每个节点内部又维护了一个Node链表,用来存储同一频次下不同时间访问的缓存,按照时间顺序,从前到后,最前的是最近被访问的缓存。
阅读全文