自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 Shell编程规范:Don‘t use ls | grep

文章目录背景ShellCheck的规范修改写法ls -l | grep prometheus && ls -l grafana | grep 'grafana.db'for循环语句ls | grep -v '\.sql\|\.zip'最后参考背景最近在写一个私有化部署脚本的时候频繁的使用了ls和grep的组合,但是插件ShellCheck却一直在给我标黄,我这该死的洁癖终于在今天受不了了,这个使用了这么多年的好搭档怎么就那么不讨喜呢!ShellCheck的规范很明显,提示告诉我

2020-08-26 23:08:29 934

原创 Logstash使用mongodb插件报错: ArgumentError: wrong number of arguments (given 2, expected 1)

文章目录背景安装插件过程背景今天在使用logstash收集日志存储到mongodb的安装过程遇到了个错误,记录下来,错误就是下面这样:配置文件很简单,由于是测试环境,命令行传入日志输入由ruby过滤一下内容,转换一个time属性的字符串日期为ISODate。input { stdin { }}filter { ruby { path => "/usr/local/etc/logstash/parse_json_records.rb" } date { m

2020-08-06 23:23:17 2903 1

原创 Vim注释行的方法

文章目录一、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

2020-08-05 19:12:01 3868

原创 ssh命令的常用使用场景

文章目录一、最简单的登陆二、登陆+执行命令三、端口转发四、参考一、最简单的登陆就是简单登陆一下主机,默认端口22ssh {hostname}@{ip}➜ Charles ssh [email protected] login: Tue Aug 4 09:46:12 2020 from 172.31.254.239[root@hubin ~]#二、登陆+执行命令连接上服务器后执行命令ssh -l {hostname} {hostip} command➜ Char

2020-08-04 18:25:38 336

原创 设计模式之单例模式(Java的所有实现)

文章目录概念饿汉式实现懒汉式实现一懒汉式实现二双重判断指令重排可见性懒汉式实现三加载时机线程安全概念JVM中,单例对象只有一个实例存在。饿汉式实现public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() {

2020-07-23 23:17:02 877

原创 数据库事务的ACID及隔离级别

文章目录ACID概念四大特性并发控制隔离级别串行化可重复读提交读未提交读默认隔离级别读现象举例脏读不可重复读幻读隔离级别 VS 读现象隔离级别 VS 锁持续时间ACID概念在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务。ACID特性是指数据库管理系统(DBMS)在写入或更新数据的过程中,为保证事务(transaction)是正确可

2020-07-20 17:29:20 2107 1

原创 CLH lock queue的原理解释及Java实现

文章目录背景概念解释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的博客,

2020-07-19 10:44:11 986

原创 从Guarded Block来看Java中的wait和notify方法

文章目录预备知识概览Java中的线程同步wait()方法wait()wait(long timeout)wait(long timeout, int nanos)notify() & notifyAll()notify()notifyAll()发送者-接收者同步问题为什么要把wait()方法放入while语句中?为什么要同步send()和receive()方法?总结预备知识Java线程的生命周期概览本文探究一下Java最基础的机制之一:线程同步我们先讨论一些并发相关的术语和方法论,接着会提

2020-07-18 11:03:04 552

原创 Java线程的生命周期(有代码演示)

文章目录概览NEWRUNNABLEBLOCKEDWAITINGWAITINGTERMINATED概览Java语言中,多线程是由线程的核心概念驱动的,而线程的生命周期会经历以下的不同状态。Java java.lang.Thread类包含了一个静态类State,它定义了线程的状态,在任意一个时间点上,线程只可能是其中的一个状态,我们接下来逐一讨论每个状态。NEW新创建且还未被执行的线程在我们调用start()方法之前当前线程将一直保持该状态:Runnable runnable = new N

2020-07-17 15:13:48 1039 3

原创 JUC并发工具包之Phaser Part3 场景使用

文章目录概览模拟场景定义不同的阶段(每个阶段运行的任务不同)预先定义线程池,设置5个线程Phaser1Phaser2Phaser3Phaser4组织4个阶段结果输出输出说明格式执行流程总结概览本文我们将看一看Java并发包中的Phaser,正如JDK中描述那样,它和CyclicBarrier、CountDownLatch提供的功能很类似,但是多了一些使用场景。A reusable synchronization barrier, similar in functionality to CyclicB

2020-07-06 22:32:58 656

原创 JUC并发工具包之Phaser Part2 源码分析

文章目录预备知识主要方法new Phaser()register()即doRegister(int registrations)internalAwaitAdvance()arriveAndAwaitAdvance()其他方法Phaser相对于CyclicBarrier和CountDownLatch的优势写在最后预备知识读Phaser的源码很大的一个特点就是位运算太多,还有就是QNode使用的是Treiber Stack,建议先看下另外几篇文章,会很有帮助。JUC并发工具包之Phaser Part1

2020-07-06 22:32:07 502

原创 JUC并发工具包之Phaser Part1 结构与状态

JUC并发工具包之Phaser Part1 结构与状态文章目录预备知识主要属性重要属性stateevenQ & oddQ一个内部类QNode位运算演算使用到的变量状态的二进制位分布unarrived值的计算parties值的计算phase值的计算arrived值的计算预备知识Java常用的二进制位操作(左移、右移、无符号右移、加法、减法)Java中的位掩码BitMask理解与使用Treiber Stack主要属性// 状态变量,用于存储当前阶段phase、参与者数parties、未

2020-07-06 22:29:07 419

原创 线程池中状态与线程数的设计分析(ThreadPoolExecutor中ctl变量)

文章目录预备知识源码分析submit()源码分析shutdownNow()源码分析代码输出设计目的与优点预备知识可以先看下我的另一篇文章对于Java中的位掩码BitMask的解释。1、一个整数在jvm中占用了4个字节,共32bits2、最高位的bit代表符号位,0为正数、1为负,剩余的31bits则代表数字部分3、反码加1即为补码4、对于负数而言,是以补码的形式存储在内存中的。以-7(int)为例1)、将-7的绝对值转化为二进制:0000 0000 0000 0000 0000 00

2020-07-04 12:58:52 895

原创 Java中的位掩码BitMask

文章目录JDK源码的使用日常工作中的使用JDK源码的使用最近在JDK源码中闲逛,无意中看到了java.lang.reflect.Modifier这个类,这个类很简单,都是些常量定义和判断方法,于是扒了扒代码实现的含义,我们就看个isPublic方法吧:/** * Return {@code true} if the integer argument includes the * {@code public} modifier, {@code false} otherwise. * * @par

2020-07-03 23:06:02 985

原创 理解与使用Treiber Stack

文章目录背景名称由来CompletableFuture源码实现FutureTask实现Treiber Stack抽象实现入栈出栈示例参考背景最近在很多JDK源码中都看到了Treiber stack这个单词。比如CompletableFuture中的:volatile Completion stack; // Top of Treiber stack of dependent actions比如FutureTask中的:/** Treiber stack of waiting th

2020-07-02 23:38:28 1007

原创 先更新缓存还是先更新数据库

文章目录概览先更新缓存,再更新数据库考虑两个并发操作:线程A写,线程B读考虑两个并发操作:线程A写,线程B写先更新数据库,再更新缓存考虑两个并发操作:线程A写,线程B读考虑两个并发操作:线程A写,线程B写概览说这个问题之前得看下几种缓存模式,可以先看下缓存模式(Caching Aside、Read Through、Write Through、Write Behind)这篇文章。先更新缓存,再更新数据库考虑两个并发操作:线程A写,线程B读1、线程A发起一个写操作,第一步delete cache

2020-06-26 21:08:45 7868 15

原创 缓存模式(Cache Aside、Read Through、Write Through、Write Behind)

文章目录概览Cache-Aside读操作更新操作1、缓存失效2、缓存更新Read-ThroughWrite-ThroughWrite-Behind总结参考概览缓存是一个有着更快的查询速度的存储技术,这里的更快是指比起从初始的数据源查询(比如数据库,以下都称作数据库)而言。我们经常会把频繁请求的或是耗时计算的数据缓存起来,在程序收到请求这些数据的时候可以直接从缓存中查询数据返回给客户端来提高系统的吞吐量,现在我们来看看有哪些缓存模式可以考虑。Cache-AsideCache-Aside是最广泛使用的缓

2020-06-25 23:43:55 6638 3

原创 Java线程的死锁和活锁

文章目录1、概览2、死锁2.1、什么是死锁2.2 死锁举例2.3 避免死锁3、活锁3.1 什么是活锁3.2 活锁举例3.3 避免活锁1、概览当多线程帮助我们提高应用性能的同时,它同时也带来一些问题,本文我们将借助几个小例子看下两个问题,死锁和活锁。2、死锁2.1、什么是死锁死锁发生在当两个或多个线程一直在等待另一个线程持有的锁或资源的时候。这会导致一个程序可能会被拖垮或者直接挂掉,因为线程们都不能继续工作了。经典的哲学家进餐问题非常好的展示了多线程下的同步问题并且经常被用来当作死锁的例子。2.

2020-06-23 23:35:58 1206

原创 紧急发布用cherry-pick检出当前分支所有我的提交记录

文章目录背景操作命令cherry-pickgit logShell脚本背景公司接了个新项目,需在平台上增加几个新接口,问题是本来说是和平台一起迭代发布的时间提前了,但当前的代码都和其他开发人员一起提交到了develop中,现在要提前发布只能从master拉出一个分支来把我的提交都添加上去然后测试发布。操作命令cherry-pick当时想到的第一个命令就是这个,检出我的所有提交,然后应用到另一个分支中去。平时使用这个命令只是简单的pick一个提交,现在需要编写个shell脚本,自动化我们某段时间内的

2020-06-22 22:24:16 697

原创 SQL相关子查询是什么?和嵌套子查询有什么区别?

文章目录两者的各种叫法相关子查询MySQL解释相关子查询Wikipedia解释相关子查询执行步骤拆解相关子查询和嵌套查询的区别参考资料两者的各种叫法相关子查询叫做:Correlated Subqueries非相关子查询也叫普通子查询或嵌套子查询:Nested SubQueries相关子查询MySQL解释相关子查询是一个子查询中引用了某张表且这张表也在子查询外部被使用到。比如:SELECT * FROM t1WHERE column1 IN ( SELECT column1 FROM

2020-06-21 20:57:47 4662 1

原创 慢SQL优化:where id in (select max(id)...) 改为join后性能提升400倍

文章目录背景原SQL发现问题解决问题造成全表扫描的原因有哪些子查询的限制Design problem修改SQL性能对比背景有两张表,都是主键递增,类似于主表和明细表:statistics_apply:统计申请表,主键applyId,7万多条记录statistics_apply_progress:统计申请进度表(申请统计的状态变更记录表),主键progressId,字段applyId保存的是上表的主键,30多万条记录现在我们需要通过多个applyId查询对应的最新的progress记录。当前

2020-06-20 16:18:53 3519 2

原创 JUC并发工具包之Semaphore

文章目录Semaphore (JDK)Timed Semaphore (Apache Commons)Semaphore vs. MutexCodeRepoSemaphore (JDK)我们使用semaphore去限制获取特定资源的并发线程数量。下面的例子中,我们实现了一个简单的登录队列来限制登入系统的用户数量:class LoginQueueUsingSemaphore { private Semaphore semaphore; public LoginQueueUsin

2020-06-18 23:02:39 732

原创 JUC并发工具包之CyclicBarrier & CountDownLatch的异同

1、介绍本文我们将比较一下CyclicBarrier和CountDownLatch并了解两者的相似与不同。2、两者是什么当谈到并发,将这两者概念化的去解释两者是做什么的,这其实是一件很有挑战的事情。首先,这两者都是管理多线程的工具。其次,两者都具备让一个或多个线程等待执行的功能。2.1 CountDownLatchCountDownLatch可以使一个线程阻塞等待其它多个线程执行到countDown方法处,直到最后的count属性递减为0。我们可以把这想象成餐馆中待上菜的餐盘(西餐中的餐

2020-06-17 19:23:30 749

原创 JUC并发工具包之CyclicBarrier

1、简介CyclicBarrier是一个同步器,允许多个线程等待彼此直到达一个执行点(barrier)。CyclicBarrier都是在多个线程必须等到彼此都到达同一个执行点后才执行一段逻辑时才被使用。barrier被叫做cyclic是因为阻塞线程恢复后可以重复使用barrier2、使用CyclicBarrier的构造器很简单,传入一个整形表示线程数再调用barrier实例的await()方法表示所有线程要到达这一共同的执行点。public CyclicBarrier(int parties

2020-06-16 22:14:41 1530

原创 JUC并发工具包之CountDownLatch

1、介绍本文将介绍CountDownLatch并给出实践中的几个例子,通过使用CountDownLatch我们可以让一个线程阻塞直到其他一个或多个线程执行完成。A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.2、并发编程中的用法简单的说,CountDownLatch有一个counter

2020-06-15 21:14:27 643

原创 jxl(2.6.10)导出Excel触发fullgc

jxl(2.6.10)导出Excel触发fullgc

2023-02-09 11:47:33 287

原创 JPA query between的多种方式(mongodb为例)

背景JPA+MongoDB查询,给定一段时间范围查询分页结果,要求时间范围包含。Page<Log> findByCtimeBetweenOrderByCtime( LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);这时候打印的日志为:find using query: { "ctime" : { "$gt" : { "$date" : 1605682694000 }, "$lt"

2020-11-25 18:21:14 2144

原创 IntelliJ IDEA 行注释的缩进设置(不自动添加注释到行首)

文章目录现状修改对比最后现状想注释一行或一个方法,//注释总是生成在行首:修改对比要修改的配置在这:我们可以在注释后添加一个空格,就变成了:最后设置完了看下注释效果:这看起来才舒服。...

2020-08-10 18:44:07 1461 1

原创 Java中的Unsafe类

文章目录概览方法分类初始化操作属性方法操作数组内存管理线程挂起和恢复内存屏障CAS机制使用利用反射修改启动参数概览Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,一旦能够直接操作内存,这也就意味着:不受jvm管理,也就意味着无法被GC,需要我们手动GC,稍有不慎就会出现内存泄漏。Unsafe的不少方法中必须提供原始地址(内存地址)和被替换对象的地址,偏移量要自己计算,一旦出现问题就是JVM崩溃级别的异常,会导致整个JVM实例崩溃,表现为应用程序直接crash掉。直接操作内存,

2020-07-06 12:56:37 555

原创 Java常用的二进制位操作(左移、右移、无符号右移、加法、减法)

符号位最高位的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

2020-07-05 15:17:38 1477

原创 MySQL常用命令与语句

文章目录Shell命令系统信息查看系统变量设置系统变量数据库操作查看表信息修改表语句操作表操作索引操作约束操作列查询常用语句Shell命令mysql -uroot -p123 -h127.0.0.1 -P3306 #登录mysqladmin kill ${processId} #杀掉进程IDmysqldump -uroot -p123 test1 > test_with_data.sqlmysqldump -uroot -p123 test1 --ignore-table test1.use

2020-06-30 22:45:08 417

原创 Sonar检测Math.abs(new Random().nextInt()) “Use the original value instead”

今天早上旁边同事喊我看一个Sonar检测出的问题:当时看了好几眼没觉得这个有太大问题,于是又看了下Sonar建议:这是说Math.abs()方法使用在数字上面可能返回最小值,觉得这个挺有意思的,于是Google一下:在Oracle docs: Unary Minus Operator -中有这么一段话:The integer operators do not indicate overflow or underflow in any way.整数的操作不会告诉我们向上溢出还是向下溢出。所以

2020-06-30 13:43:12 1631 2

原创 JPA使用之@Query的常用写法

文章目录常规修改使用冒号常规修改使用问号查询返回指定列第1种写法查询返回指定列第2种写法参考常规修改使用冒号@Modifying@Query("update StatisticsApply set status = :status where id = :applyId")void updateStatusByApplyId(@Param("applyId") Long applyId, @Param("status") Integer status);常规修改使用问号@Modifying@

2020-06-29 09:26:29 3905

原创 理解与解决缓存穿透、缓存击穿、缓存雪崩、热点数据失效问题

文章目录一、前言二、缓存穿透1、什么是缓存穿透2、穿透带来的问题3、解决办法1)、 缓存空值2)、BloomFilter4、如何选择三、缓存击穿1、什么是击穿2、会带来什么问题3、如何解决四、缓存雪崩1、什么是缓存雪崩2、解决办法1)、事前:2、事中:3)、事后:五、解决热点数据集中失效问题1、设置不同的失效时间2、互斥锁六、参考:一、前言昨天晚上接到阿里的电面电话,过程中就问到了关于缓存相关的问题。虽然以前接触过,多多少少了解了一些。但是之前自己并没有好好记录这些内容,在真正面试的时候,并没有回答得

2020-06-27 23:12:08 474

原创 Java中的主线程

文章目录概览主线程怎么来控制主线程主线程和main()函数的关系主线程中的死锁(单个线程)概览前段时间有同事提到了主线程这个名词,但当时我们说的主线程是指Java Web程序中每一个请求进来时处理逻辑的线程。当时感觉这个描述很奇怪,所以就来研究下这个主线程的确切语义。Java提供了内置的多线程编程支持,多线程包括两个或多个可并发执行的部分,每一部分叫做线程,每个线程定义了单独的执行部分。主线程当一个Java程序启动的时候,会有一个线程立即开始运行,这个线程通常被我们叫做程序中的主线程,因为它是在我

2020-06-24 23:15:25 1073

原创 人人都能学会系列之ThreadLocal

文章目录1、概览2、ThreadLocal API3、存储用户数据在ConcurentHashMap中4、存储用户数据在ThreadLocal中5、小心把ThreadLocal和ExecutorService一起使用1、概览本文我们来看下java.lang包中的ThreadLocal,它赋予我们给每个线程存储自己数据的能力。2、ThreadLocal APIThreadLocal允许我们存储的数据只能被特定的线程``访问。我们现在存储一个整形并把它和一个特定的线程绑定:ThreadLocal&l

2020-06-19 23:34:05 648

原创 为什么Java不允许创建范型数组

文章目录问题示例变型(variant)数组中的变型范型中的变型结论问题示例List<Integer>[] intListArr = new ArrayList<Integer>[8]; // 编译时报错能看到这么看似没啥问题的一个简单语句甚至连编译都不会通过,为了能理解这里面的缘由,我们先得了解变型(Variant)的概念变型(variant)协变(covariant)允许在子类出现的地方用超类替换(A feature which allows to substitu

2020-06-14 16:22:13 720 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除