随笔分类 -  Java

摘要:一、问题 最近基于JSR269做的代码插桩有一个编译问题需要定位,而且问题不是每次都能复现,需要多编译几次才行,出问题的项目是Maven构建的,相对较大,每次构建耗时就比较长。所以我就想,是否有什么配置项能加快编译的速度,比如:并行编译?最近在看Javac源码,也的确没有发现有任何多线程处理源码编译 阅读全文
posted @ 2019-04-02 23:25 土豆条 阅读(901) 评论(0) 推荐(0) 编辑
摘要:背景 在1.7之前的版本,当数组元素较多(几百、几千,或者更多)的时候,在这种前提扩容,涉及全量元素的遍历和坐标的重新定位,这个耗时会比较长。这是之前存在的一个弊端吧。那么引入红黑树之后就解决了问题,那是怎么解决的呢,我说下自己的理解。 过程分析 既然数组扩容导致了变慢,那就是从扩容方向思考,谁决定 阅读全文
posted @ 2019-01-23 17:50 土豆条 阅读(743) 评论(0) 推荐(0) 编辑
摘要:背景 在使用Lamdba表达式,一直以为是内部类的方式实现的,但是一想如果每次调用都实例化一个内部类,性能肯定不好,难道Java里的lambda表达式真的是这么实现的吗?也许是该研究下原理了。 正文 1. 测试代码: 执行编译命令 ,得到class文件。 2. 查看字节码 查看字节码 得到: 通过字 阅读全文
posted @ 2018-11-20 20:13 土豆条 阅读(555) 评论(0) 推荐(0) 编辑
摘要:背景 最近接触的几个工程中Lombok插件出现频率比较高,趁机了解一下原理。 简要说明: 受益于 "JSR 269 API" ,程序可以在编译阶段对AST进行节点的操作,从而注入相关的功能结点,从而包含在最终的字节码文件里。 优点: 1. 减少了coding过程中的一些Getter/Setter等代 阅读全文
posted @ 2018-11-08 19:23 土豆条 阅读(1079) 评论(0) 推荐(0) 编辑
摘要:1. 背景 最近在做数据库(MySQL)方面的升级改造。现状是数据库同时被多个应用直连,存在了一些问题: 1. 有大量的重复代码,维护成本较高,也不优雅; 2. 出现SQL语句质量的问题无法很快定位到是哪个应用导致的; 3. 数据库调用方过于分散,不便于统一控制,比如部分业务数据的读写、屏蔽等; 4 阅读全文
posted @ 2018-10-16 14:04 土豆条 阅读(373) 评论(0) 推荐(0) 编辑
摘要:今天搬砖的时候遇到一个问题,idea总是卡死,完全无法愉快的玩耍。幸好机器是Linux系统的。于是通过以下方式解决了问题: 1. 通过 命令,查看系统运行状态发现4个CPU中有1个CPU用户占用率为100%。经查得知正是idea的进程pid1。 2. 通过在 找到了idea的线程tid1。 3. 通 阅读全文
posted @ 2016-10-25 18:34 土豆条 阅读(4819) 评论(0) 推荐(0) 编辑
摘要:原子类java.util.concurrent.atomic. 原理分析 在并发编程下,原子操作类的应用可以说是无处不在的。为解决线程安全的读写提供了很大的便利。 原子类保证原子的两个关键的点就是:可见性和写数据一致性。 对修改可见 使用volatile来保证读取到最新的数据。 volatile语义 阅读全文
posted @ 2016-10-01 13:07 土豆条 阅读(318) 评论(0) 推荐(0) 编辑
摘要:好久没有更新博客了,今天试着用简单的语言把synchronized的使用说清楚。 阅读全文
posted @ 2016-09-02 23:35 土豆条 阅读(218) 评论(0) 推荐(0) 编辑
摘要:Apache commons configuration setDelimiterParsingDisable不生效的处理 项目中有用到commons configuration,版本1.9。 配置初始化大概这样: 在属性配置文件(×.properties)中,如下设置: 经调用发现value的值为 阅读全文
posted @ 2016-07-20 20:34 土豆条 阅读(902) 评论(0) 推荐(0) 编辑
摘要:最近retrofit比较火,尤其是在app端。于是抽空了解了一下。 阅读全文
posted @ 2016-07-04 01:29 土豆条 阅读(204) 评论(0) 推荐(0) 编辑
摘要:之前使用线程池都是通过Executors.new...这种方式创建,因为Doug Lea已经给我们做了相对通用的设置,这么做的话简单又安全。但是有时候根据不同的场景可能需要进行一些自定义的操作。 比如,我需要一个初始情况下,使用10条核心线程运行任务,但是考虑到服务器的资源有限,我们希望限制在最多只 阅读全文
posted @ 2016-05-25 00:25 土豆条 阅读(663) 评论(0) 推荐(0) 编辑
摘要:为了形成一个完整清晰的认识,将概念和关系梳理出来,把坑填平。 I/O多路复用 I/O多路复用主要解决传统I/O单线程阻塞的问题。它通过单线程管理多个FD,当监听的FD有状态变化的时候的,调用回调函数,通知用户已经准备完毕。用户收到通知,就可以进行IO操作了。这种机制大大的提高了系统的吞吐量。I/O多 阅读全文
posted @ 2016-05-01 00:09 土豆条 阅读(920) 评论(0) 推荐(0) 编辑
摘要:查看线上日志,遇到一个诡异的问题,就是系统大量空指针的异常,但是没有打印堆栈,导致不方便定位问题。 经过一番代码调试,确定并非程序代码问题。没有线索之后,从Google找到了答案:是因为在server模式下运行的时候,有一个默认选项是 XX:+OmitStackTraceInFastThrow,这个 阅读全文
posted @ 2016-04-29 14:59 土豆条 阅读(7405) 评论(0) 推荐(0) 编辑
摘要:Reactor模式,I/O多路复用,NIO,EPOLL,水平触发模式 阅读全文
posted @ 2016-04-25 00:19 土豆条 阅读(265) 评论(0) 推荐(0) 编辑
摘要:背景 最近写了一个定时任务,期望是同一时间只有一台机器运行即可。因为是应用是在集群环境下跑的,所以需要自己实现类一个简陋的Redis单机锁。 原理 主要是使用了Redis的SET NX特性,成功设置的那个客户端则被认为拿到了锁,没有设置成功的其他客户单则认为没有拿到锁。 在分布式环境下使用锁是挺危险 阅读全文
posted @ 2016-04-18 17:25 土豆条 阅读(562) 评论(0) 推荐(0) 编辑
摘要:Stream:parallel乱序 Java 8 stream流为处理集合时非常方便。遇到的一个坑是为了提高在多核cpu下的性能,尝试了parallel()。数据源是HashSet的,在做分割的时候发现每次跟串行的结果都不一样。 解决方式: + 后来改为有序的LinkedHashSet再使用para 阅读全文
posted @ 2016-04-14 18:17 土豆条 阅读(1389) 评论(0) 推荐(1) 编辑
摘要:注:本文参考 源码。 LinkedHashMap是基于HashMap实现的数据结构,与HashMap主要的不同为每个Entry是使用双向链表实现的,并且提供了根据访问顺序进行排序的功能。 LinkedHashMap中的内部类Entry大概如下,可以看到都是基于链表(数据结构意义上的)节点的操作: 当 阅读全文
posted @ 2016-04-01 00:23 土豆条 阅读(267) 评论(0) 推荐(1) 编辑
摘要:线程安全 ArrayList内部没有实现原子性操作,所以是非线程安全的。如果需要在线程安全的环境下使用List的话,需要使用Vector 或者CopyOnWriteArrayList,具体场景,自行深入了解。 扩容算法 1. 如代码所示,先在原来容量的基础上进行 1.5 倍的扩容; 2. 如果扩容之 阅读全文
posted @ 2016-03-13 20:41 土豆条 阅读(221) 评论(0) 推荐(0) 编辑
摘要:背景 在以前coding的时候,有时会些异步代码,大多数情况下都是为了把不是立刻需要的数据单独处理,以提供相应速度。当然还有人多开些线程来提高运算效率,但是在本中主要关注解决的是异步的问题。 原理 异步工具类就是在系统启动时候先初始化一个符合参数自己工作环境的线程池,所有的异步操作占用的线程都是从这 阅读全文
posted @ 2016-03-02 16:09 土豆条 阅读(946) 评论(0) 推荐(0) 编辑
摘要:客户端可以通过执行 subscribe 命令订阅一个或多个频道,每当有其他客户端向被订阅的频道发送消息时,频道所有的订阅者都会收到这条消息。 客户端还可以通过执行 psubscribe 命令订阅一个或多个模式,消息也会被发送给与频道相匹配模式的订阅者。 频道的订阅与退订 当一个客户端执行 subs... 阅读全文
posted @ 2016-01-02 00:58 土豆条 阅读(193) 评论(0) 推荐(0) 编辑