11 2018 档案
摘要:单例模式有五种写法:懒汉、饿汉、双重检验锁、静态内部类、枚举 懒汉式线程不安全 懒汉式,线程安全 双重检验锁 事实上在 JVM 中这句话大概做了下面 3 件事情。 理解以上三个过程很重要,能直接通过字节码的角度让你知道 JVM的指令重排序;相关知识点最好了解一下,比如单线程访问尽管指令重排序 但还是
阅读全文
摘要:遇到new 、getstatic、putstatic或invokestatic者四条字节码指令时,如果类没有进行初始化,则需要先触发其初始化。对应的JAVA代码场景是
new 实例对象、读取或设置一个类的静态字段[被final修饰、已在编译器把结果放入常量池的静态字段除外]时候,以及调用一个类的静态方法的时候
使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则先触发其初始化
当初始化一个类的时候,如果发现父类还没有过初始化,则需要其先触发其父类的初始化
当虚拟机启动时,用户需要指定一个要执行的主类(包含main方法的那个类)虚拟机先初始化这个主类
当使用jdk1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic,REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应类没有进行过初始化,则先触发其初始化
阅读全文
摘要:自家公司关于git commit 的规范;
阅读全文
摘要:这篇文章比较深入的从free为起点 折射出的一些概念;比如 buff/cache是怎么一回事[涉及内存页等话题]; available这个参数与free参数有什么联系[其实available可以理解为当内存不足时它会释放buffer内存补给应用程序进程使用];以及shared的概念 swap等 让你全方位的从操作系统层面了解free 的命令。平时查看可以用free -h 或间隔周期查询 free -h -s xxx
阅读全文
摘要:在JAVA多任务并行执行的开发过程中,笔者有一点疑惑
corePoolSize maximumPoolSize 这几个参数跟OS具体关系是什么呢?
我线程JAVA的线程与内核的线程关系梳理一下,清楚了原理会比较好理解。
因为从JMM层面 JVM线程其实最终是一个所谓轻量级进程的概念与系统内核线程(每个内核线程视为内核的一个分身)是一比一的关系,其实最终还是要调用内核线程 内核通过操纵调度器对线程进行分配资源,负责将任务给各个处理器上处理;
所以这个线程数还是受限于OS层面的线程数,明白这个就OK。所以最大线程数不是越大越好 过大也没什么作用还是要根据OS本身的参数进行适配。
像上面的corePoolSize如果处理的各个任务理论上马上就能完成 其实不用设置的过大,尽量复用线程
maximumPoolSize最大就是OS内核线程数 超过这个也没什么意义
阅读全文
摘要:/*简易版的HASHMAP包括基本的GET PUT思想
* 从数组头部开始线性通过key比较效率低;具有固定尺寸不灵活
*/
这个版本get取值按照线性思维逐个遍历数组元素比较 比较耗时,而且初始化容器具有固定尺寸也不够灵活
阅读全文
摘要:linkedhashmap中关于LRU算法的实现
阅读全文
摘要:如何避免MAVEN项目JAR包冲突;解析MAVEN仲裁机制及SPRINGBOOT的实现
阅读全文
摘要:像笔者场景 首次启动任务需要将大量数据载入缓存,sqlite作为嵌入式数据库,无需跨进程获取数据 有一定优势,能节省不少时间;但弊端是你需要多维护一份数据,本地sqlite数据同步及一致性也是问题
1.SQLite并非作为一个独立进程通过某种通信协议(例如socket)与应用程序通信,而是作为应用程序的一部分,应用程序通过调用SQLite的接口直接访问数据文件
2.同时访问同一个数据而没有问题。可以同时平行读取同一个数据库。但同一时间只能有一个进程或线程进行数据写入
3.仅支持触发器,不能修改或删除列 只能通过重新创建表的方式迂回进行
4.SQLite不进行类型检查 你可以把字符串插入到整数列中
阅读全文
摘要:知乎关于pull request形象的解释说明
阅读全文