随笔分类 -  Java

Java语言、JVM等
摘要:1. 背景 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是Doug Lea大师创作的用来构建锁或者其他同步组件(信号量、事件等)的基础框架类。JDK中许多并发工具类的内部实现都依赖于AQS,如ReentrantLock, Sem 阅读全文
posted @ 2017-06-03 17:52 活在夢裡 阅读(20266) 评论(18) 推荐(27)
摘要:背景 在应用程序中,时常会碰到需要维护一个map,从中读取一些数据避免重复计算,如果还没有值则计算一下塞到map里的的小需求(没错,其实就是简易的缓存或者说实现记忆化)。在公司项目里看到过有些代码中写了这样简易的缓存,但又忽视了线程安全、重复计算等问题。本文主要就是谈谈这个小需求的实现。 实现 Ha 阅读全文
posted @ 2017-05-30 22:13 活在夢裡 阅读(1797) 评论(3) 推荐(2)
摘要:1. 背景 ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。 ThreadLocal非常适合对Java多线程编程感兴趣的程序员作为入门类阅读,原因 阅读全文
posted @ 2017-05-20 15:39 活在夢裡 阅读(22895) 评论(36) 推荐(62)
摘要:背景 最近在啃《多处理器编程的艺术》,书中的7.6节介绍了时限锁——实现了tryLock方法的队列锁。 书中重点讲解了tryLock的实现,也就是如何实现在等待超时后退出队列,放弃锁请求,并且能让后继线程感知到。 在实现的过程中,我为TOLock补充了lock方法的实现。代码如下所示: public 阅读全文
posted @ 2017-04-22 11:00 活在夢裡 阅读(465) 评论(0) 推荐(0)
摘要:记录一个遇到的隐蔽的空指针异常。 公司里的测试同事之前发现项目里有处偶现的空指针异常。 大致的代码是这样的: 对于固定的测试集,多次重跑偶现空指针出现在groupingBy中,乍一看推断是item.getInvestor()为null导致getName()出现空指针。但经过debug查看,实际上是偶 阅读全文
posted @ 2017-03-08 22:54 活在夢裡 阅读(1846) 评论(1) 推荐(0)
摘要:这是一本什么书? 最早是在图灵社区看到今年年初这本书的问世,作者刘新宇获得清华大学自动化系学士和硕士学位,长期从事软件研发,关注基本算法和数据结构,尤其是函数式算法,目前就职于亚马逊中国的仓储和物流技术团队。 直到过年期间,和朋友一起逛上海书城,看到了实体书,便随手买了一本。至今也有十来天,稍稍有选 阅读全文
posted @ 2017-02-18 15:51 活在夢裡 阅读(2151) 评论(1) 推荐(0)
摘要:前几天,阿里巴巴发布了《阿里巴巴Java开发手册(正式版》,第一时间下载阅读了一番。 不同于一般大厂内部的代码规范,阿里巴巴的这本Java开发手册,可谓包罗万象,几乎日常Java开发中方方面面都有所涉及。 在知乎上,也有关于这本开发手册的讨论十分热烈的帖子。 由于里面涉及的内容比较多,下面重点罗列下 阅读全文
posted @ 2017-02-13 21:51 活在夢裡 阅读(14341) 评论(0) 推荐(1)
摘要:昨天在做公司项目时,我在一处地方加了一个逻辑校验,之后测了下发现在方法调用深处有一处NPE,来源于另一个同事的代码。 其实NPE本应该是个Java编程中老掉牙的问题,但我觉得这一处错误还是比较典型的,值得一提。 这里的 是一个枚举类型,code是枚举中的一个int类型。而条件表达式右边的cycleT 阅读全文
posted @ 2016-12-02 02:36 活在夢裡 阅读(1806) 评论(0) 推荐(0)
摘要:问题 在项目中,有一处地方需要对日期区间进行排序 我需要以日期区间的开始日为第一优先级,结束日为第二优先级进行排序 代码 我当时写的代码如下: 这段看上去很正确的代码,居然是没办法编译的。 做了一些试验 当仅以日期开始日排序,可以编译没问题 那么把Comparator单独提取出来呢 这样当然是没有问 阅读全文
posted @ 2016-11-23 02:37 活在夢裡 阅读(3520) 评论(0) 推荐(0)
摘要:代理模式(Proxy Pattern)是一种比较常见的设计模式,在很多场合都会被用到。 所谓代理指的是让其他的类代替完成一些任务(执行一些方法等),在软件开发中代理模式具有非常重要的作用,面向切面编程(AOP)便是基于代理模式运作的编程范式。 下面介绍一下其中的静态代理与动态代理,基于Java语言。 阅读全文
posted @ 2016-07-03 22:58 活在夢裡 阅读(3310) 评论(0) 推荐(0)
摘要:关于ThreadPoolExecutor的源码解读,请参考我的最新博客《ThreadPoolExecutor源码解读》。 Java中的线程即是工作单元也是执行机制,从JDK 5后,工作单元与执行机制被分离。工作单元包括Runnable和Callable,执行机制由JDK 5中增加的java.util 阅读全文
posted @ 2016-07-01 22:54 活在夢裡 阅读(12778) 评论(0) 推荐(2)
摘要:volatile通常被认为是一种轻量级的synchronized,字面上它表示易变的,在并发编程中,它保证了共享变量的可见性。所谓可见性指的是,某个线程对变量进行操作后,其他线程能够读取到操作后的最新结果。 CPU通常不会直接与内存通信,内存中的数据首先会被读取到缓存中进行读写。当对声明了volat 阅读全文
posted @ 2016-06-29 16:50 活在夢裡 阅读(683) 评论(0) 推荐(0)
摘要:首先来看一下String中hashCode方法的实现源码 在String类中有个私有实例字段hash表示该串的哈希值,在第一次调用hashCode方法时,字符串的哈希值被计算并且赋值给hash字段,之后再调用hashCode方法便可以直接取hash字段返回。 String类中的hashCode计算方 阅读全文
posted @ 2016-06-29 11:20 活在夢裡 阅读(46591) 评论(0) 推荐(1)
摘要:最近一直在练用Java写题,今天无意发现一道很简单的二分题(链接),我一开始是直接开int[]数组调用Arrays.sort()去排序,没想到TLE了,原来是因为jdk中对于int[]的排序是使用快速排序的,jdk中相关调用源码如下 1 public static void sort(int[] a 阅读全文
posted @ 2016-06-10 02:39 活在夢裡 阅读(2257) 评论(0) 推荐(0)