IM的扫码登录功能如何实现?一文搞懂主流的扫码登录技术原理
扫码登录这个功能,最早应该是微信的PC端开始搞,虽然有点反人类的功能(不扫码也没别的方式登录),但不得不说还是很酷的。 于是,搞IM产品的老板和产品经理们,从此又多了一个要抛给程序员们的需求——“为什么微信有扫一扫登录,而我们的没有?”。 好吧,每次只要是微信有的功能,IM程序…
你真的了解 volatile 吗?
最近经过查阅各种资料,并结合自己的思考和实践,对volatile有了比较深刻的认识,在此总结并分享给大家。 工作内存:即java线程的本地内存,是单独给某个线程分配的,存储局部变量等,同时也会复制主存的共享变量作为本地的副本,目的是为了减少和主存通信的频率,提高效率。 可见性是…
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),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在…
代码质量之持续提升
我曾经单纯的认为修改少就意味着错误少,所以习惯性在原有逻辑上打补丁,可错误往往就是因为那不起眼的修改引起的。聪明的人警醒我,我存在认知错误,因为添加一个新功能的最好办法是,先修改现有的代码,使逻辑更加容易被理解,使新功能容易被加入,避免设计腐败。 令我印象最深的是项目中大量的过…