<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[靖哥哥的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/HalfImmortal</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; HalfImmortal]]></copyright><item><title><![CDATA[jxl(2.6.10)导出Excel触发fullgc]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/128950335</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/128950335</guid><author>HalfImmortal</author><pubDate>Thu, 09 Feb 2023 11:47:33 +0800</pubDate><description><![CDATA[jxl(2.6.10)导出Excel触发fullgc]]></description><category></category></item><item><title><![CDATA[JPA query between的多种方式（mongodb为例）]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/110139333</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/110139333</guid><author>HalfImmortal</author><pubDate>Wed, 25 Nov 2020 18:21:14 +0800</pubDate><description><![CDATA[背景
JPA+MongoDB查询，给定一段时间范围查询分页结果，要求时间范围包含。
Page&lt;Log&gt; findByCtimeBetweenOrderByCtime(
            LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);

这时候打印的日志为：
find using query: { "ctime" : { "$gt" : { "$date" : 1605682694000 }, "$lt"]]></description><category></category></item><item><title><![CDATA[Shell编程规范：Don‘t use ls | grep]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/108249589</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/108249589</guid><author>HalfImmortal</author><pubDate>Wed, 26 Aug 2020 23:08:29 +0800</pubDate><description><![CDATA[文章目录背景ShellCheck的规范修改写法ls -l | grep prometheus &amp;&amp; ls -l grafana | grep 'grafana.db'for循环语句ls | grep -v '\.sql\|\.zip'最后参考
背景
最近在写一个私有化部署脚本的时候频繁的使用了ls和grep的组合，但是插件ShellCheck却一直在给我标黄，我这该死的洁癖终于在今天受不了了，这个使用了这么多年的好搭档怎么就那么不讨喜呢！



ShellCheck的规范
很明显，提示告诉我]]></description><category></category></item><item><title><![CDATA[IntelliJ IDEA 行注释的缩进设置（不自动添加注释到行首）]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107919518</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107919518</guid><author>HalfImmortal</author><pubDate>Mon, 10 Aug 2020 18:44:07 +0800</pubDate><description><![CDATA[文章目录现状修改对比最后
现状
想注释一行或一个方法，//注释总是生成在行首：

修改对比
要修改的配置在这：

我们可以在注释后添加一个空格，就变成了：

最后
设置完了看下注释效果：

这看起来才舒服。

...]]></description><category></category></item><item><title><![CDATA[Logstash使用mongodb插件报错： ArgumentError: wrong number of arguments (given 2, expected 1)]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107852042</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107852042</guid><author>HalfImmortal</author><pubDate>Thu, 06 Aug 2020 23:23:17 +0800</pubDate><description><![CDATA[文章目录背景安装插件过程
背景
今天在使用logstash收集日志存储到mongodb的安装过程遇到了个错误，记录下来，错误就是下面这样：

配置文件很简单，由于是测试环境，命令行传入日志输入由ruby过滤一下内容，转换一个time属性的字符串日期为ISODate。
input {
  stdin { }
}

filter {
  ruby {
    path =&gt; "/usr/local/etc/logstash/parse_json_records.rb"
  }
  date {
    m]]></description><category></category></item><item><title><![CDATA[Vim注释行的方法]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107822840</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107822840</guid><author>HalfImmortal</author><pubDate>Wed, 05 Aug 2020 19:12:01 +0800</pubDate><description><![CDATA[文章目录一、Visual block加注释去注释二、正则表达式加注释去注释
一、Visual block
加注释

1、首先按键盘上的ESC进入命令行模式
2、再按Ctrl+V进入VISUAL BLOCK模式
3、利用上下左右键调整需要注释多少行以及行的宽度
4、再按Shift+i或s进入插入模式
5、输入代表注释的符号，比如#
6、再次按ESC键，这时就可完成多行注释 可能需要等上一会，不要着急、

去注释

前三步与加注释相同


1、首先按键盘上的ESC进入命令行模式
2、再按Ctrl+V进入VISU]]></description><category></category></item><item><title><![CDATA[ssh命令的常用使用场景]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107794238</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107794238</guid><author>HalfImmortal</author><pubDate>Tue, 04 Aug 2020 18:25:38 +0800</pubDate><description><![CDATA[文章目录一、最简单的登陆二、登陆+执行命令三、端口转发四、参考
一、最简单的登陆

就是简单登陆一下主机，默认端口22

ssh {hostname}@{ip}
➜  Charles ssh root@192.168.21.218
Last login: Tue Aug  4 09:46:12 2020 from 172.31.254.239
[root@hubin ~]#

二、登陆+执行命令

连接上服务器后执行命令

ssh -l {hostname} {hostip} command
➜  Char]]></description><category></category></item><item><title><![CDATA[设计模式之单例模式（Java的所有实现）]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107550403</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107550403</guid><author>HalfImmortal</author><pubDate>Thu, 23 Jul 2020 23:17:02 +0800</pubDate><description><![CDATA[文章目录概念饿汉式实现懒汉式实现一懒汉式实现二双重判断指令重排可见性懒汉式实现三加载时机线程安全
概念
JVM中，单例对象只有一个实例存在。
饿汉式实现
public class Singleton {
    private static Singleton instance = new Singleton();
        
    private Singleton() {
    }
     
    public static Singleton getInstance() {
      ]]></description><category></category></item><item><title><![CDATA[数据库事务的ACID及隔离级别]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107468387</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107468387</guid><author>HalfImmortal</author><pubDate>Mon, 20 Jul 2020 17:29:20 +0800</pubDate><description><![CDATA[文章目录ACID概念四大特性并发控制隔离级别串行化可重复读提交读未提交读默认隔离级别读现象举例脏读不可重复读幻读隔离级别 VS 读现象隔离级别 VS 锁持续时间
ACID
概念


在数据库系统中，一个事务是指：由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐，从原账户扣除金额，以及向目标账户添加金额，这两个数据库操作的总和，构成一个完整的逻辑过程，不可拆分。这个过程被称为一个事务。


ACID特性是指数据库管理系统（DBMS）在写入或更新数据的过程中，为保证事务（transaction）是正确可]]></description><category></category></item><item><title><![CDATA[CLH lock queue的原理解释及Java实现]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107432756</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107432756</guid><author>HalfImmortal</author><pubDate>Sun, 19 Jul 2020 10:44:11 +0800</pubDate><description><![CDATA[文章目录背景概念解释Java代码实现定义QNode定义Lock接口定义CLHLock使用场景运行代码代码输出代码解释unlock中的set操作为什么要有myPred，不用行不行参考
背景
相信大部分人在看AQS的时候都能看到注释上有这么一段话：
The wait queue is a variant of a "CLH" (Craig, Landin, and Hagersten) lock queue.

为了更好的理解AQS中使用锁的思想，所以决定先好好理解CLH锁。
在网上能查到很多关于CLH的博客，]]></description><category></category></item><item><title><![CDATA[从Guarded Block来看Java中的wait和notify方法]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107419316</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107419316</guid><author>HalfImmortal</author><pubDate>Sat, 18 Jul 2020 11:03:04 +0800</pubDate><description><![CDATA[文章目录预备知识概览Java中的线程同步wait()方法wait()wait(long timeout)wait(long timeout, int nanos)notify() &amp; notifyAll()notify()notifyAll()发送者-接收者同步问题为什么要把wait()方法放入while语句中？为什么要同步send()和receive()方法？总结
预备知识
Java线程的生命周期
概览
本文探究一下Java最基础的机制之一：线程同步
我们先讨论一些并发相关的术语和方法论，接着会提]]></description><category></category></item><item><title><![CDATA[Java线程的生命周期（有代码演示）]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107409063</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107409063</guid><author>HalfImmortal</author><pubDate>Fri, 17 Jul 2020 15:13:48 +0800</pubDate><description><![CDATA[文章目录概览NEWRUNNABLEBLOCKEDWAITINGWAITINGTERMINATED
概览
Java语言中，多线程是由线程的核心概念驱动的，而线程的生命周期会经历以下的不同状态。

Java java.lang.Thread类包含了一个静态类State，它定义了线程的状态，在任意一个时间点上，线程只可能是其中的一个状态，我们接下来逐一讨论每个状态。
NEW

新创建且还未被执行的线程

在我们调用start()方法之前当前线程将一直保持该状态：
Runnable runnable = new N]]></description><category></category></item><item><title><![CDATA[JUC并发工具包之Phaser Part3 场景使用]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107169790</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107169790</guid><author>HalfImmortal</author><pubDate>Mon, 06 Jul 2020 22:32:58 +0800</pubDate><description><![CDATA[文章目录概览模拟场景定义不同的阶段（每个阶段运行的任务不同）预先定义线程池，设置5个线程Phaser1Phaser2Phaser3Phaser4组织4个阶段结果输出输出说明格式执行流程总结
概览
本文我们将看一看Java并发包中的Phaser，正如JDK中描述那样，它和CyclicBarrier、CountDownLatch提供的功能很类似，但是多了一些使用场景。

A reusable synchronization barrier, similar in functionality to CyclicB]]></description><category></category></item><item><title><![CDATA[JUC并发工具包之Phaser Part2 源码分析]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107169767</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107169767</guid><author>HalfImmortal</author><pubDate>Mon, 06 Jul 2020 22:32:07 +0800</pubDate><description><![CDATA[文章目录预备知识主要方法new Phaser()register()即doRegister(int registrations)internalAwaitAdvance()arriveAndAwaitAdvance()其他方法Phaser相对于CyclicBarrier和CountDownLatch的优势写在最后
预备知识
读Phaser的源码很大的一个特点就是位运算太多，还有就是QNode使用的是Treiber Stack，建议先看下另外几篇文章，会很有帮助。

JUC并发工具包之Phaser Part1]]></description><category></category></item><item><title><![CDATA[JUC并发工具包之Phaser Part1 结构与状态]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107169714</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107169714</guid><author>HalfImmortal</author><pubDate>Mon, 06 Jul 2020 22:29:07 +0800</pubDate><description><![CDATA[JUC并发工具包之Phaser Part1 结构与状态
文章目录预备知识主要属性重要属性stateevenQ &amp; oddQ一个内部类QNode位运算演算使用到的变量状态的二进制位分布unarrived值的计算parties值的计算phase值的计算arrived值的计算
预备知识

Java常用的二进制位操作（左移、右移、无符号右移、加法、减法）
Java中的位掩码BitMask
理解与使用Treiber Stack

主要属性
// 状态变量，用于存储当前阶段phase、参与者数parties、未]]></description><category></category></item><item><title><![CDATA[Java中的Unsafe类]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107152594</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107152594</guid><author>HalfImmortal</author><pubDate>Mon, 06 Jul 2020 12:56:37 +0800</pubDate><description><![CDATA[文章目录概览方法分类初始化操作属性方法操作数组内存管理线程挂起和恢复内存屏障CAS机制使用利用反射修改启动参数
概览
Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力，一旦能够直接操作内存，这也就意味着：

不受jvm管理，也就意味着无法被GC，需要我们手动GC，稍有不慎就会出现内存泄漏。
Unsafe的不少方法中必须提供原始地址(内存地址)和被替换对象的地址，偏移量要自己计算，一旦出现问题就是JVM崩溃级别的异常，会导致整个JVM实例崩溃，表现为应用程序直接crash掉。
直接操作内存，]]></description><category></category></item><item><title><![CDATA[Java常用的二进制位操作（左移、右移、无符号右移、加法、减法）]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107139345</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107139345</guid><author>HalfImmortal</author><pubDate>Sun, 05 Jul 2020 15:17:38 +0800</pubDate><description><![CDATA[符号位
最高位的bit代表符号位，0为正数、1为负，剩余的31bits则代表数字部分
负数的表述
对于负数而言（绝对值取反码再加一，此即为补码），是以补码的形式存储在内存中的。以-7（int）为例

将-7的绝对值转化为二进制：
0000 0000 0000 0000 0000 0000 0000 0111
将上面的二进制以反码表示：
1111 1111 1111 1111 1111 1111 1111 1000
转化为补码：
1111 1111 1111 1111 1111 1111 1111 1001
]]></description><category></category></item><item><title><![CDATA[线程池中状态与线程数的设计分析（ThreadPoolExecutor中ctl变量）]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107122859</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107122859</guid><author>HalfImmortal</author><pubDate>Sat, 04 Jul 2020 12:58:52 +0800</pubDate><description><![CDATA[文章目录预备知识源码分析submit()源码分析shutdownNow()源码分析代码输出设计目的与优点
预备知识

可以先看下我的另一篇文章对于Java中的位掩码BitMask的解释。


1、一个整数在jvm中占用了4个字节，共32bits
2、最高位的bit代表符号位，0为正数、1为负，剩余的31bits则代表数字部分
3、反码加1即为补码
4、对于负数而言，是以补码的形式存储在内存中的。以-7（int）为例

1)、将-7的绝对值转化为二进制：
0000 0000 0000 0000 0000 00]]></description><category></category></item><item><title><![CDATA[Java中的位掩码BitMask]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107117146</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107117146</guid><author>HalfImmortal</author><pubDate>Fri, 03 Jul 2020 23:06:02 +0800</pubDate><description><![CDATA[文章目录JDK源码的使用日常工作中的使用
JDK源码的使用
最近在JDK源码中闲逛，无意中看到了java.lang.reflect.Modifier这个类，这个类很简单，都是些常量定义和判断方法，于是扒了扒代码实现的含义，我们就看个isPublic方法吧：
/**
 * Return {@code true} if the integer argument includes the
 * {@code public} modifier, {@code false} otherwise.
 *
 * @par]]></description><category></category></item><item><title><![CDATA[理解与使用Treiber Stack]]></title><link>https://blog.youkuaiyun.com/HalfImmortal/article/details/107095779</link><guid>https://blog.youkuaiyun.com/HalfImmortal/article/details/107095779</guid><author>HalfImmortal</author><pubDate>Thu, 02 Jul 2020 23:38:28 +0800</pubDate><description><![CDATA[文章目录背景名称由来CompletableFuture源码实现FutureTask实现Treiber Stack抽象实现入栈出栈示例参考
背景
最近在很多JDK源码中都看到了Treiber stack这个单词。

比如CompletableFuture中的：

volatile Completion stack;    // Top of Treiber stack of dependent actions


比如FutureTask中的：

/** Treiber stack of waiting th]]></description><category></category></item></channel></rss>