代码片段
以下是一段很简单的函数,对传入的参数进行 除以8 的操作:
1 | long arith(long a) { |
zeng haha
最近在看《深入理解 Linux 内核》,讲到内核同步的时候提到了编译器屏障 __asm__volatile__("" ::: "memory")
,这行内联汇编的语句作用如下:
1)asm 用于指示编译器在此插入汇编语句
2)volatile 用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。即:原原本本按原来的样子处理这这里的汇编。
3) memory 强制 gcc 编译器假设 RAM 所有内存单元均被汇编指令修改,这样 CPU 中的通用寄存器中的数据将作废
这个语义与 C 中的定义是等价的,但是在 Java 中,volatile 还有另外一层加强的语义:
声明成 volatile 的字段,Java 线程模型能确保所有线程看到这个变量的值是一致的。
上线前压测发现业务线程 hang 死在 LinkedBlockingQueue,同时另外一条线程在 LinkedBlockingQueue.forEach() 中死循环了。看来是触发了 JDK(1.8.0_261) 的 bug。
项目中用到了apache的httpclient,使用了池化的PoolingHttpClientConnectionManager,研究了一下相关的实现以及JDK原生的HttpURLConnection 的连接复用实现。