MyBatis 源码解析:通过源码深入理解 SQL 的执行过程
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 我们以 SqlSessionFactoryBuilder为入口,看下mybatis是如何解析配置文件…
java线程池ThreadPoolExecutor八种拒绝策略浅析
谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发。而不论你用FixedThreadPool还是CachedThreadPool其背后实现都是Threa…
真香!JetBrains 推出编程字体 Mono,开源免费可商用
JetBrains 推出了一款名为 "Mono" 的字体。按照官方的说法,Mono 是专为开发者打造的编程字体,希望借此提升他们在查阅代码时的体验。 JetBrains 还解释了他们打造 Mono 的缘由。因为开发者大部分时间都在查阅代码,并且他们也会花时间寻找一款适合自己的“…
一个开发工程师,真的需要了解业务吗?
我也深有感触,全世界的码农都一个鸟样。 这让我想起了,同样也是他,在多年之前,对我提了警醒——要重视业务。 从那之后,我一直狂奔在技术+业务的双修道路上。 放在以前,码农这个族群一定是稀罕动物。但在今天,这个世界最不缺的应该就是码农了,未来最廉价的也将是码农。 仅有泛泛一技,在…
正确地使用Redis的SETNX实现锁机制
setNX,是set if not exists 的缩写,也就是只有不存在的时候才设置, 设置成功时返回 1 , 设置失败时返回 0 。可以利用它来实现锁的效果,但是很多人在使用的过程中都有一些问题没有考虑到。 例如某个查询数据库的接口因为请求量比较大所以加了缓存,并设定缓存过…
Java和Docker限制的那些事儿
Java和Docker不是天然的朋友。 Docker可以设置内存和CPU限制,而Java不能自动检测到。使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题。 Java和Docker的结合并不是完美匹配的,最初的时候离完美匹配有相当大的距离。对于初…
Mybatis:颠覆你心中对事务的理解
1.说到数据库事务,人们脑海里自然不自然的就会浮现出事务的四大特性、四大隔离级别、七大传播特性。四大特性还好说,问题是七大传播特性是哪儿来的?是Spring在当前线程内,处理多个数据库操作方法事务时所做的一种事务应用策略。事务本身并不存在什么传播特性,不要混淆事务本身和Spri…
Serializable原理
序列化是将对象变为可传输内容的过程, 反序列化则是将可传输内容转化为对象的过程. Java原生序列化方式是通过实现Serializable接口实现的. 不实现该接口会导致无法序列化, 抛出异常如下: Java原生序列化是通过IO包中的ObjectInputStream和Obje…
什么会导致Java应用程序的CPU使用率飙升?
人们常说,计算密集型程序的CPU密集程度更高。 频繁的GC; 如果访问量很高,可能会导致频繁的GC甚至FGC。当调用量很大时,内存分配将如此之快以至于GC线程将连续执行,这将导致CPU飙升。 序列化和反序列化。稍后将给出一个示例:当程序执行xml解析时,调用量会增加,从而导致C…
Spring Boot2+JPA之悲观锁和乐观锁实战
在我们开发的项目中,大量的请求,或者同时的操作,很容易导致系统在业务上发生并发的问题。通常讲到并发,解决方案无非就是前端限制重复提交,后台进行悲观锁或者乐观锁限制。 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在…
代码质量之持续提升
我曾经单纯的认为修改少就意味着错误少,所以习惯性在原有逻辑上打补丁,可错误往往就是因为那不起眼的修改引起的。聪明的人警醒我,我存在认知错误,因为添加一个新功能的最好办法是,先修改现有的代码,使逻辑更加容易被理解,使新功能容易被加入,避免设计腐败。 令我印象最深的是项目中大量的过…
面试官问我 volatile 是否存在伪共享问题?我懵逼了
共享在 Java 编程里面我们可以这样理解,有一个 Share 类,它有一个 value 的属性。如下: 我们初始化 Share 的一个实例,然后启动多个线程去操作它的 value 属性,此时的 Share 变量被多个线程操作的这种情况我们称之为 共享。 大家都知道在不添加任何…
Synchronized 同步出现失效的问题你碰到过吗?
Synchronized ,大家都知道这个是Java 提供的一种原子性内置锁,其实现原理是通过获取对象的监视器monitor进行来实现同步的,只有当线程获取到对象monitor才能继续执行,否则该线程进行阻塞(等待)。 示例: 描述一下代码示例: 该方法涉及++ 1 ,当如果多…
Java 有值类型吗?
有人看了我之前的文章『Swift 语言的设计错误』,问我:“你说 Java 只有引用类型(reference type),但是根据 Java 的官方文档,Java 也有值类型(value type)和引用类型的区别的。比如 int,boolean 等原始类型就是值类型。” 现在…
是时候扔掉 Postman 了,试试 IntelliJ IDEA 自带的高能神器!
接口调试是每个软件开发从业者必不可少的一项技能,一个项目的的完成,可能接口测试调试的时间比真正开发写代码的时间还要多,几乎是每个开发的日常工作项。所谓工欲善其事必先利其器,在没有尝到IDEA REST真香之前,postman(chrome的一款插件)确实是一个非常不错的选择,具…
一周的闪念胶囊,总有一个能帮助到你
1、不管是做需求还是测试,都应该考虑整个链路,确保兼容性或者其他模块不受影响。比如内容创作改动,应该考虑到审核侧、内容分发侧是否正常。 2、需求一定要经过测试。不要站在自己的角度,以为测试人员无法测试某种场景。因为方法总比困难多,比如可以把链路当中修改的点单独拎出来进行对比测试…
超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下
面试精选集,快快前往领取吧!offer.liangsonghua.me/。关注微信公众号:松花皮蛋的黑板报,获取更多精彩! 如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然。别慌,这里有一款低开销、自带火焰图、让你大呼…
技术面试最后反问面试官的话
面试精选集,快快前往领取吧!offer.liangsonghua.me/。关注微信公众号:松花皮蛋的黑板报,获取更多精彩! 绝对不要想把这个列表里的每个问题都问一遍。 请记住事情总是灵活的,组织的结构调整也会经常发生。 拥有一个 bug 追踪系统并不会保证高效处理 bug。CI…
Spring的BeanUtils的copyProperties方法需要注意的点
最近项目中在和第三方进行联调一个接口,我们这边发送http请求给对方,然后接收对方的回应,代码都是老代码。根据注释,对方的SDK中写好的Request类有一个无法序列化的bug,所以这边重新写了一个Request类,基本属性都是相同的,但是重点是有一个属性是静态内部类,还有两个…
分布式系统之负载均衡(案例篇)
我们知道单机的承载能力和垂直扩展能力都是有上限的,它无法满足高并发高吞吐量的场景,所以常使用水平扩展也就是增加机器数量来满足需求。但是不同机房、同机房不同年代上架的机器的性能也是千差万别的,甚至业务之前申请到的都是8核16G内存的配置脱销了(申请时抢不到),我们只能放低身位选择…