Java开发
文章平均质量分 90
鞠骞的博客
一个互联网小兵的自述...
微信公众号《andyqian》作者
展开
-
Java 基本功 之 AQS
本文首发于个人微信公众号《andyqian》,期待与你相遇 ~前言在之前的文章《Java 基本功 之 CAS》中介绍了CAS的概念以及原理,今天来介绍 Java concurrent.locks 包 中的基础组件AQS - AbstractQueuedSynchronizer类。看到这里,也许你会感到些许陌生,心想:这家伙是干啥的?怎么从来没见过?能用来干什么?别急,下面一一解...原创 2019-12-08 22:43:49 · 245 阅读 · 0 评论 -
软件设计实践
本文首发于个人微信公众号《andyqian》, 期待你的关注!前言拿破仑曾经说过:“不想当将军的士兵不是好士兵”。而在软件行业中,几乎每个程序员心里都有一个成长为架构师的梦想。程序员与架构师之间,不仅仅是角色的转变,更多的是知识的积累,以及架构,设计能力的转变。最近有幸参与了一些设计工作,系统算不上复杂,庞大。但在这过程中将自己的不足暴露的淋漓尽致,如同裸奔,有着凉飕飕的感觉。记录...原创 2019-12-01 20:39:23 · 682 阅读 · 0 评论 -
使用 Mybatis 真心不要偷懒!
本文首发于个人微信号《andyqian》,期待你的关注~前言这篇文章非常简单,没有什么高深技术。这些细节用过Mybatis的童鞋都知道。写这篇文章的缘由是:在最近的工作中,接手了一个外包项目,发现项目中 mapper 文件全部是自动生成的,代码十分冗余且不易维护,用知乎上的回答,这算得上是名副其实的”屎山”代码了。现在用 Mybatis做持久层算是Java系的主流,其中有一...原创 2019-05-07 21:50:50 · 270 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor
本文首发于个人微信公众号《andyqian》,关注免费获取Java学习资料前言多线程一直是Java进阶的必修课。在Java中,我们很早就知道可以通过 Thread 类和 Runnable 接口来实现多线程。与之有着类似职责的数据库连接,也可通过JDBC创建与使用。但我们深知无论是数据库连接的创建与销毁,还是线程的创建与销毁,都是一件及其消耗性能的事情。为了减少这种情况的发生,前辈...原创 2019-05-15 08:05:46 · 147 阅读 · 0 评论 -
Java 基本功 之 CAS
本文首发于个人微信公众号《andyqian》, 期待你的关注!前言 在Java并发编程中,我们经常使用锁对竞争资源予以并发控制,以解决资源竞争的问题。但无论是使用 Lock 还是 Synchronized,随着锁机制的引入,就不可避免的带来另一个问题,也就锁与解锁时的上下文切换,线程等待 等性能问题。现在回过头来看,在有些场景中,是否真的需要引入锁才能解决竞争资源共享...原创 2019-04-20 15:31:53 · 170 阅读 · 0 评论 -
再谈Java 生产神器 BTrace
首发个人公众号《andyqian》,期待你的关注~前言在上一篇文章《Java 生产神器 BTrace》中我们认识了BTrace,并了解到 BTrace 脚本如何编写,如何执行,不熟悉的朋友,也可以对着文章照葫芦画瓢。但对于我们技术人来说,仅有这些是不够的,我们必须弄清楚每一个参数的意义,用法,才能百变不离其宗。另外,在这基础之上,还有一些更高阶的用法也是需要我们掌握的。用法...原创 2019-05-04 14:38:55 · 170 阅读 · 0 评论 -
Java 生产神器 BTrace
本文首发于个人微信公众号《andyqian》,期待你的关注!前言在《说说Java单元测试》文章中,强调了单元测试的重要性,也提倡大家一定要写单元测试,能帮我们筛选掉很多低级错误,找出一些没必要的bug,避免生产事故。单元测试通过后,我们开始集成,随着服务集成的日渐增多,业务逻辑也变得越来越复杂,在这样的前提下,解决bug就变得异常复杂。在本地环境中,我们可以通过日志分析 + debug的方...原创 2019-04-26 00:21:12 · 171 阅读 · 0 评论 -
重构不完全指南!
本文首发于个人公众号《andyqian》,期待你的关注前言程序员在职业生涯中,不可避免的就是接手老项目,重构历史项目。事实证明,不论是老项目还是新项目都会遇到这种情况,不信你去看看一周前自己写的代码,是不是有很大的改进空间?对于新入行的朋友们也要做好准备,以后也或多或少会面对这样的情况。在面对这样的情况时,不管你接手前是多么不愿意,接手后怎么破口大骂,甚至有过无数次想放弃的念头。但问题...原创 2019-04-16 23:24:29 · 185 阅读 · 0 评论 -
说说Java 位运算
本文首发于个人微信公众号《andyqian》,期待你的关注~前言 我们都知道,在计算机世界里,再复杂,再美的程序,到最后都会变成0与1。也就是我们常说的:二进制。二进制相信大家都很熟悉。与现实世界不同的是,在现实世界里,我们通常都是用十进制来表示的,也就是遇十进一,这些都是我们熟悉的。到这里,我们就会发现端倪,现实世界中的十进制与计算机中的二进制其计量单元是不一样的。那它们之间怎么转换...原创 2019-03-06 22:57:24 · 123 阅读 · 0 评论 -
Git的诞生以及常用命令
本文首发于个人微信公众号《andyqian》,期待你的关注~Git 的诞生在企业开发中,源代码使用版本控制工具已经是常态了。如果你还没用过版本控制工具,那就很不应该了。要说版本控制工具,现在比较流行的是SVN和Git。今天这里要介绍的是Git,Git 的诞生也是非常有趣的,Linux系统大家都知道吧,其创始人Linus在开发它时,因为Linux系统是开源的,一开始参与的人少,都是Lin...原创 2019-02-27 23:35:14 · 145 阅读 · 0 评论 -
ThreadPoolExecutor 原理解析
本文首发于个人公众号《andyqian》,期待你的关注前言在上一篇文章《Java线程池ThreadPoolExecutor》中描述了ThreadPoolExecutor的基本概念,以及一些常用方法。这对于我们来说,是远远不够的,今天就一起来看TreadPoolExecutor类的内部实现。线程池状态在学习ThreadPoolExecutor源码时,首先来看看下面这段代码,也...原创 2019-06-14 20:42:53 · 603 阅读 · 0 评论 -
系统设计的几点思考
首发于个人公众号《andyqian》,期待你的关注!前言又有好一阵子没有更新文章了,今天聊聊系统设计的几点思考。对于我们来说,始终会独自设计,研发,迭代系统。为系统的演进,整个生命周期负责。而负责的系统到底处于什么状态?是否健康?是否出现问题?这些都是需要考虑的问题。开关 对关键流程,进行开关设置。例如:交易开关,资金池开关。对于金融系统而言,特别是出金端,要做好严格的把控。...原创 2019-06-11 23:24:19 · 489 阅读 · 0 评论 -
JDK SPI 源码解读
本文首发于个人微信公众号《andyqian》, 期待你的关注!前言在之前的文章《Seata 之 config 模块源码解读》中提到了Microkernel + Plugin 的架构模式。如果对它还不熟悉的话,没关系。我们可以简单的将其理解为一个接口的多个实现,与设计模式中的策略模式极为相似。其中调用组装这些 Plugin 的地方称之为 Microkernel,而接口的实现则可以理解为 ...原创 2019-09-19 09:48:54 · 211 阅读 · 0 评论 -
Java 代码中几类典型的 "坏味道"
本文首发于个人微信公众号《andyqian》, 关注即可获得一线互联网内推!前言最近一段时间进行了部分代码的code review。其中有 review 的,也有被review的。在这过程中发现了许多问题,而其中就包含许多本不该发生的。同样的,这些不该发生的问题如果携带上线,随之而来的则是一个个的生产事故。对于金融系统来说,会直接造成资产损失,而对于医疗软件而言,甚至涉及生命安全。经过...原创 2019-09-12 14:13:04 · 671 阅读 · 0 评论 -
Seata 之 config 模块源码解读
本文首发于个人微信公众号《andyqian》,关注即可获取一线互联网内推机会!前言我们在编写项目过程中,配置文件几乎是标配,从最简单且最常用的 application.properties 文件,到现在集群环境下的配置中心。也算是互联网技术发展的一个缩影(单体应用到分布式应用)。在这方面,目前有非常多的开源实现,如:zookpeer,nacos,apollo 等等。像是命题作文下交付的...原创 2019-09-07 16:24:09 · 1275 阅读 · 1 评论 -
接口设计的五点建议!
本文首发于个人微信公众号《andyqian》, 期待你的关注!前言接口是目前:前后端交互(Rest),系统交互(RPC)最普遍的一种方式。一个好的接口,应该清晰易懂,职责明确,易于维护。反之,则会造成很多困扰。特别是Open API,谁做谁知道。基于这样的前提以及自己之前踩过的坑,就成了这篇文章的由来。编写文档文档与程序员之间有着一种非常奇妙的关系。一句话概括就是:”写之,痛之...原创 2019-09-03 23:06:39 · 1051 阅读 · 0 评论 -
Seata 分布式事务
本文首发于个人微信公众号《andyqian》, 期待你的关注~前言上一篇文章《Seata 之 rm-datasource 源码解读》发出后。有很多同学对 Seata 是什么还不够了解,今天我们就起来认识一下它。简介Seata 是一款由阿里巴巴与蚂蚁金服共同开源的分布式事务框架。由最初的Fescar(Fast & Easy Commit And Rollback)框架更名...原创 2019-08-16 14:02:30 · 1494 阅读 · 0 评论 -
Seata 之 rm-datasource 源码解读
本文首发于个人微信公众号《andyqian》, 期待你的关注!前言这篇文章主要讲述的是分布式事务 seata 框架的 rm - datasource 模块。文章会按照以下几点进行讲解:简介 结构 源码解析 涉及的设计模式 后续的扩展简介我们知道seata框架本身是事务的协调者,协调多个本地事务“符合事务的特性”,从而构成一个”分布式的全局事务”。这也是seata框架的...原创 2019-08-09 21:51:07 · 1604 阅读 · 0 评论 -
Dubbo 线程池源码解析
本文首发于个人微信公众号《andyqian》,期待你的关注~前言之前文章《Java线程池ThreadPoolExecutor》《ThreadPoolExecutor 原理解析》中,分别讲述了ThreadPoolExecutor 的概念以及原理,今天就一起来看看其在 Dubbo 框架中的应用。ThreadFactory 与 AbortPolicy Dubbo 为我们提供了几种不...原创 2019-07-22 11:51:20 · 399 阅读 · 0 评论 -
你所不知道的 BigDecimal
本文首发于个人微信公众号《andyqian》,期待你的关注~前言在Java中,我们通常使用 BigDecimal 类型来表示金额,特别是在金融,财务系统中,使用的特别多。例如:转账金额,手续费等等。今天就一起来认识下BigDecimal。为什么是BigDecimal ?在此之前,我们先来讲讲为什么要使用 BigDecimal ?而不是Float,Double类型?其实光从表现形...原创 2019-07-18 09:35:20 · 504 阅读 · 0 评论 -
Ant Design 圣诞节的踩蛋!
本文首发于个人微信公众号《andyqian》,期待你的关注~前言圣诞节,并非中国传统节日!但随着最近几年的发展,在中国的节日氛围也越发浓厚。商家,互联网企业自然不会放过这么好的日子,大多会选择在这一天进行大额优惠,有些网站,APP甚至会换上圣诞主题,以迎接圣诞节的到来。有些网站,APP则会在系统中留下彩蛋,以供用户去发现,在无言之中给用户创建些许惊喜,让用户体验企业对产品的用心。但是。。留...原创 2018-12-26 09:46:03 · 593 阅读 · 0 评论 -
浅谈 Java JPDA
本文首发于个人微信公众号《andyqian》,期待你的关注~前言 程序员在坊间有非常多有趣的故事,其中就有这么一则:”这个在我的电脑上是好的,没问题的呀,诺,你看咯,一定是你打开姿势不正确,浏览器版本不正确,操作系统不统一等,总之不是我代码问题(傲娇)”。看到这里,有些朋友也许会笑,甚至拿着这些梗来调侃我们程序员兄弟。我是第一个不同意的,做技术的都知道,上面的回答一点毛病都没有,甚至称...原创 2018-12-19 14:44:20 · 233 阅读 · 0 评论 -
初探JDK源码之默认字符集
本文首发于个人微信公众号: 《andyqian》,期待你的关注!前言 今天我们以String类中的getBytes()方法为例,来看一看JDK源码中的默认字符集,getBytes()方法在帮助文档中是 这样写的:Encodes this String into a sequence of bytes using the platform’s default charset,原创 2017-11-25 09:32:13 · 1182 阅读 · 1 评论 -
谈谈MySQL隐式类型转换
本文首发于个人微信公众号《andyqian》,期待您的关注!前言 今天我们继续回到MySQL系列文章中,谈一谈MySQL中隐式类型转换。(其实我最早知道是在慢SQL优化中知道隐式类型转换概念的),在说隐式类型转换之前,首先我们通过一个实例来看看是怎么回事。数据结构本文中所有的操作,都是基于该数据结构(有兴趣的童鞋,可以实验):create table t_原创 2017-11-11 22:27:37 · 2106 阅读 · 0 评论 -
Java程序员常用Linux命令
Java程序员都应该知道的Linux命令原创 2017-11-10 12:53:22 · 706 阅读 · 0 评论 -
Spring中html字符编解码
Spring中html字符编解码场景描述 今天基于 jeesite 在做一个简单的curd的功能时,遇到个比较有意思的问题,在此记录一下,在使用springMVC form标签作双向绑定时,如果文本域中填写的为html代码,提交到后端会自动进行转义,如下:1提交后,在后端接收到的content自动会将 &等符号自动原创 2017-09-20 23:33:30 · 1923 阅读 · 0 评论 -
GitLab安装实践
GitLab安装实践一 前言至从版本管理从SVN切换至Git后,对Git简直爱不释手,不仅每天在使用Git,平时也会逛Git相关的网站,如GitHub,Gitlab。就连自己的博客也是基于Git来搭建的,今天就为大家介绍一个非常好用的Git项目仓库管理工具,也就是今天的主角-GitLab。二 GitLab是什么?首先我们需要认识一下,GitLab是什么,原创 2017-08-08 02:06:22 · 438 阅读 · 0 评论 -
Zookeeper安装配置详解
前言在分布式系统中,Zookeeper已经是必备组件了,其重要性,可见一斑,想从头了解Zookeeper? https://zookeeper.apache.org/doc/r3.4.10/zookeeperOver.html 可以让您更了解Zookeeper,今天主要为大家介绍如何在Ubuntu下如何安装和配置Zookeeper。配置1. 下载我们通过http://www.a原创 2017-07-04 21:17:03 · 658 阅读 · 0 评论 -
说说Quartz Scheduler任务调度框架
前言 在很多公司,特别是互联网公司,需要在指定的时间进行一些跑批任务来完成业务实现,Java中实现定时的方式有很多,其中可自己实现,也有比较成熟的框架,如: Quartz,今天来介绍一下Quartz的使用,简述 Quartz is a richly featured, open source job scheduling library that can be inte原创 2017-06-22 00:03:39 · 2316 阅读 · 0 评论 -
你该知道的Java注释!
本文首发于个人微信公众号《andyqian》,期待你的关注!前言 有好几天没有写文章了,实在抱歉。今天我们来说说如何编写Java注释。使用过Java的同学都非常熟悉,Java中有:单行注释 // 这是单注释多行注释 /*这是多行注释*/ Javadoc注释 /**这是javadoc注释*/ 其实这里面还有很多细节呢,下面我们一一来揭晓哪原创 2018-01-08 09:36:39 · 592 阅读 · 1 评论 -
说说Java单元测试
本文首发于个人微信公众号《andyqian》,期待你的关注!前言有几天没有更新文章了。说假话,最近忙!说实话。最近懒!前一段时间,看了阿里出的《阿里巴巴Java开发手册》觉得非常好。。有些简直太有同感了。就比如:单元测试。建议大家都看看。嗯,我们今天就来说说单元测试。什么是单元测试?说到单元测试,很多开发同学很容易忽略。甚至认为是测试才干的事情。这里需要纠正一下,对于单元测试,维基百科中是这样描述...原创 2018-02-09 09:23:23 · 723 阅读 · 0 评论 -
记一个有趣的Java OOM!
本文首发于个人微信公众号《andyqian》,期待你的关注!引言熟悉Java的童鞋,应该对OOM比较熟悉。该类问题,一般都比较棘手。因为造成此类问题的原因有很多。今天就分享一个非常有意思的案例。(说实话。这个问题,我也是前两天才遇到的。花了不少时间来分析。觉得非常有意思,记录在此。大神勿喷!)问题场景重启应用时,调试到给MQ发消息时。有如下错误:Exception in thread "Threa...原创 2018-03-03 23:25:04 · 204 阅读 · 0 评论 -
分享几份好的资料
本文首发于个人微信公众号<andyqian>, 期待你的关注~ 前言 有好几天没有更新文章了,最近确实比较忙。但仔细想想,时间挤挤也还是有的。今天给大家推荐几个比较好的开源项目。有些项目也是刚发现,自己都还没来得及细读,就分享出来了。希望能够对大家有所帮助。Linux Linux是程序员必学的技术之一,尤其是后端工程师。更应该对之有足够的了解。无论是系统服务部...原创 2018-09-02 16:26:03 · 195 阅读 · 0 评论 -
重构
前言 有好几天没有更新了,今年过的格外快些。眨眼间已经到了下半年。嗯,切入今天的正题。今天给大家推荐一本好书《重构》。说起重构,在技术圈中总有一种现象,就是不愿意接手别人的代码,不愿意维护老系统。甚至想着每进一个公司都是从零开始设计系统。殊不知,在职业生涯中,我们参与的系统更多的不是从0到1,而是从1到100的演进。在这期间,我们不免会接触别人的代码,在老系统中进行日常迭代。或许是随着时...原创 2018-08-19 15:53:50 · 300 阅读 · 0 评论 -
几个常见的Mybatis错误
本文首发于个人微信公众号《andyqian》, 期待你的关注!前言 今天记录几个Mybatis常见错误。在使用Mybatis时,或多或少的会碰到这些问题。问题本身并不难,解决起来也非常简单。下面会一一介绍各个问题出现的场景,发生原因以及解决方案。最后统一说说如何避免这类问题的发生。问题一 (不存在的列)这个问题在使用Mybatis时,属于比较常见的低级错误。问题描述:#...原创 2018-08-05 00:13:18 · 1575 阅读 · 0 评论 -
CORS跨域 实践
本文首发于个人微信公众号《andyqian》,期待你的关注~前言 系统通常都是由单体应用逐渐演化而来,演化成为前后端分离的分布式应用。在享受分布式系统带来的诸多好处之时,随之而来的也有不少新的问题。其中跨域问题就成了第一只拦路虎。今天我们就来揭露一下这只老虎的真面目!什么是跨域? 在解决问题前,我们首先得先了解什么是跨域?其实我们可以简单的理解跨域就是跨不同的”域名”。但这个域...原创 2018-07-18 08:53:40 · 501 阅读 · 0 评论 -
说几个拖垮系统的小细节!
本文首发于个人微信公众号《andyqian》,期待你的关注!前言 有好几天没有更新了,期间确实比较忙些,以至于周末也没休息。在这期间,感触还是蛮深的。现在碎片化的想法等整理好后,再以文章的形式分享出来。今天要说的是另外一个主题。我们在做系统设计时,时常会遇到系统中的一些小细节。成为系统的瓶颈。活生生的拖垮系统。那么到底是谁拖垮了你的系统呢?这就是今天要说的主题。万恶的超时时间 这是一个容易忽略...原创 2018-03-28 20:13:01 · 307 阅读 · 0 评论 -
说说Java日志
本文首发于个人微信公众号《andyqian》,期待你的关注~前言 我们在编写代码时,都知道在关键算法,逻辑性较强的地方添加注释。一来提高了代码的可维护性。二来让代码有了自可读性。如果我们把注释理解为静态的自可读性。那么,程序在运行时,我们如何才能知道程序的实际运行路径呢?这就是今天的主角--日志!为什么要打日志? 有很多朋友,不太喜欢打日志。好几百,甚至上千行的代码。啪,啪,啪的全写完!自信满满,...原创 2018-04-08 22:16:00 · 210 阅读 · 0 评论 -
Java生成PDF的若干坑
本文首发于个人微信公众号《andyqian》,期待你的关注~前言 由于工作原因,使用Java生成大量的电子凭证,也就是PDF。在之前的文章中,有写过,如何通过Java生成PDF。这里就不再描述,写这篇文章主要是为了记录我在使用Java生成PDF过程中犯过的错,以及踩过的坑。内存溢出 之前在使用生成方案的时候,我们一开始采用的是《PD4...原创 2018-03-13 22:21:11 · 4174 阅读 · 0 评论 -
一个Java细节!
本文首发于个人微信公众号《andyqian》,期待你的关注!前言 今天我们一起来做个简单有趣的实验。熟悉Java的童鞋,对ScheduledExecutorService 类应该不陌生。不记得的童鞋,先回忆下。实验一我们先看下下面这段简单的代码。如下:public class ExecutoryServiceTest { private static ScheduledExec...原创 2018-03-06 12:50:25 · 158 阅读 · 0 评论