摘要:最近有同事在项目上遇到一个场景,定时任务在往MySql插入一条数据超时了,而排查其他SQL,没有锁表的动作。排查到最后,发现是分区表导致id不唯一,加上Gap锁导致的。下面简单分析一下。 1.场景重现 1.1 没有分区的场景 先建一个没有分区的表 1 CREATE TABLE student ( 2 阅读全文
posted @ 2020-07-19 22:50 kingsleylam 阅读(92) 评论(0) 推荐(0) 编辑
摘要:什么是适配器模式 网上已有很多的教程,不细讲了。可以参考:[五分钟了解设计模式(3) 适配器模式]( https://www.cnblogs.com/kubidemanong/p/9609856.html) 在适配器模式中,一定要识别清楚,Target Adaptee Adapter分别是哪些类或接 阅读全文
posted @ 2019-11-02 23:33 kingsleylam 阅读(285) 评论(0) 推荐(0) 编辑
摘要:什么是真实执行计划 获取Oracle的执行计划,有几种方式。(本文使用Oracle 11g XE版本,以及普通用户scott登录) explain plan for 有两个步骤: explain plan for ${SQL} select from table(dbms_xplan.display 阅读全文
posted @ 2019-10-02 18:04 kingsleylam 阅读(2090) 评论(0) 推荐(1) 编辑
摘要:1. 什么是FactoryBean FactoryBean本质上是一种Bean,只是它可以产生其他的Bean,比较特殊。在上下文getBean的时候,如果传入FactoryBean的名称,得到的是FactoryBean生产的产品,而不是FactoryBean。如果要获得FactoryBean自身,那 阅读全文
posted @ 2019-08-03 09:38 kingsleylam 阅读(190) 评论(0) 推荐(0) 编辑
摘要:1. 什么是BeanPostProcessorBeanPostProcessor是一个接口,有两个方法,分别是:Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException 和 Objec 阅读全文
posted @ 2019-08-02 23:46 kingsleylam 阅读(129) 评论(0) 推荐(0) 编辑
摘要:最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多了。 不过,我倒是对线程池是如何回收工作线程比较感兴趣,所以简单分析了一下,加深对线程池的理解吧。 那么,就以JDK1.8为例分析吧。 1 阅读全文
posted @ 2019-07-25 11:34 kingsleylam 阅读(3651) 评论(0) 推荐(2) 编辑
摘要:1. 问题 最近有同事问了我一个问题,在Java编程中,当有一条线程要获取ReentrantReadWriteLock的读锁,此时已经有其他线程获得了读锁,AQS队列里也有线程在等待写锁。由于读锁是共享锁,当前线程是马上获得读锁,还是排队?如果是马上获得读锁,那岂不是阻塞的等待写锁的线程有可能一直( 阅读全文
posted @ 2019-07-24 00:38 kingsleylam 阅读(558) 评论(0) 推荐(1) 编辑
摘要:最近看到一句话:内部锁synchronized不会造成锁泄漏(Lock Leak)。 锁泄漏是指一个线程获得某个锁以后,由于程序的错误、缺陷致使该锁一直没法被释放而导致其他线程一直无法获得该锁的现象。(摘自《Java多线程编程实战指南(核心篇)》--黄文海) 很好奇JVM是怎么保证的。 我想,Jav 阅读全文
posted @ 2019-06-05 22:28 kingsleylam 阅读(303) 评论(0) 推荐(0) 编辑
摘要:最近复习JVM的知识,对于静态分派和动态分派的理解有点混乱,于是自己尝试写写代码,在分析中巩固知识。 有如下一段代码,请问每一段分别输出什么? 下面我简单地介绍一下从代码编译到方法调用的整个过程。 · 编译 先看看第1段输出,child.foo()是调用父类还是子类的静态方法呢? 在编译阶段,发生了 阅读全文
posted @ 2019-02-17 22:53 kingsleylam 阅读(620) 评论(0) 推荐(1) 编辑
摘要:多年以前,当我怀揣着前端工程师的梦想时,曾经认真阅读过《JavaScript高级程序设计(第2版)》。里面有一个问题(P147),让我一直百思不得其解。 表面上看,最终会输出各个元素对应的索引,依次输出0,1,2……9。但实际上却是输出10个10 1. 词法作用域 简单地说,词法作用域就是定义在词法 阅读全文
posted @ 2018-09-22 23:52 kingsleylam 阅读(80) 评论(0) 推荐(0) 编辑
摘要:贴代码啦 按照代码的注释操作,控制台的输出如下,观察WaitThread的变化。 testWait(): testTimedWait(): 阅读全文
posted @ 2018-04-05 18:09 kingsleylam 阅读(113) 评论(0) 推荐(0) 编辑
摘要:1. 双重校验锁实现单例的问题 在延迟实现单例时,一般代码形式如下: 看起来很简单,但这里有个容易忽略的点,就是instance变量,需要用volatile修饰。 为什么?如果不加的话会有什么问题呢? 让我们把目光聚焦到第11行,初始化instance变量。这一行代码可以分解为如下3行伪代码。 上面 阅读全文
posted @ 2018-04-05 17:35 kingsleylam 阅读(463) 评论(0) 推荐(0) 编辑
摘要:1. 动态分派 一个体现是重写(override)。下面的代码,运行结果很明显。 最终输出sub : f(); 那么虚拟机是怎么做到动态分派的呢? 不同的虚拟机有不同的实现,最常用的是使用虚方法表(Virtual Method Table) 2. 虚方法表 对于Super和Sub类,虚方法表大致如下 阅读全文
posted @ 2017-04-30 18:06 kingsleylam 阅读(1064) 评论(0) 推荐(1) 编辑
摘要:分派(Dispatch)可能是静态也可能是动态的,根据分派依据的宗量数可分为单分派和多分派。这两种分派方式的两两组合就构成了静态单分派,静态多分派,动态单分派,动态多分派这4种组合。本章讲静态分派。 1.静态分派 所有依赖静态类型来定位方法执行版本的分派动作称为静态分派。静态分派的典型应用是方法重载 阅读全文
posted @ 2017-04-30 11:36 kingsleylam 阅读(321) 评论(0) 推荐(0) 编辑
摘要:方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还没有涉及到方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍最频繁的操作,但Class文件的编译过程不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法 阅读全文
posted @ 2017-04-30 10:31 kingsleylam 阅读(512) 评论(0) 推荐(0) 编辑
摘要:初始化是类加载过程的最后一步,但由于比较重要,故放在前面先讲。 在前面的连接(准确来说是准备)阶段,类的变量已经被赋予默认值(如int类型为0,布尔类型为false,引用类型为null等)。而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。或者可以从另一个角度来表达:初始化 阅读全文
posted @ 2017-04-11 23:32 kingsleylam 阅读(166) 评论(0) 推荐(0) 编辑
摘要:1. 类的生命周期 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading),验证(Verification 阅读全文
posted @ 2017-04-11 00:13 kingsleylam 阅读(240) 评论(0) 推荐(0) 编辑
摘要:备忘录模式是在不破坏封装的原则下,捕获一个对象的状态,在对象之外保存这个状态,在必要时恢复到这个状态。 应用场景主要是将状态恢复到之前,例如Ctrl+Z的恢复,游戏从存档重新开始,JDBC事务控制。 备忘录模式的主要角色有三个: Originator,发起人,职责是发起一次存档,将自身的状态存放到M 阅读全文
posted @ 2017-04-08 17:43 kingsleylam 阅读(196) 评论(0) 推荐(0) 编辑
摘要:在实际的开发过程中,我们经常会遇到对于不同的对象采用不同的算法或者策略的场景。 一个真实的例子是这样的: 假设现在要将一个Student对象存入数据库。在逻辑层,需要对对象的字段进行合法性判断,比如ID是否超过某个阈值,名字长度是否超长。 1. if else分支方法 最常见的做法,是将参数的类型进 阅读全文
posted @ 2017-04-05 22:35 kingsleylam 阅读(285) 评论(0) 推荐(0) 编辑
摘要:正则表达式(Regular Expression, 简称RegEx)是一些用来匹配和处理文本的字符串,它是用正则表达式语言创建的,这种语言的用途主要是为了检索和替换某些文本。 本文只是《正则表达式必知必会》和传说中的三十分钟学会正则表达式的一个小总结,因此,不打算从头开始介绍正则表达式,只记录一些知 阅读全文
posted @ 2017-01-08 20:53 kingsleylam 阅读(992) 评论(2) 推荐(0) 编辑