edyang

我干了什么 究竟拿了时间换了什么
技术分享时间线软件开发、设备接入、视觉与运维实践

透彻学习 JDK 7:ConcurrentHashMap 的分段锁

并发容器不只是给整个 Map 加一把锁。

并发容器不只是给整个 Map 加一把锁。Java 7 的分段结构提供了不同的并发访问边界。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 Java 7 ConcurrentHashMap 的更新锁粒度落在分段上,不同段可以并发更新。线程...

透彻学习 JDK:线程池队列满了以后怎么办

线程池限制线程数量,却可能把压力转移到任务队列。

线程池限制线程数量,却可能把压力转移到任务队列。没有队列边界时,内存也会成为排队资源。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 ThreadPoolExecutor 的任务接纳涉及核心线程、队列、最大线程数和拒绝策略。队列未满时不...

透彻学习 JDK:volatile 能见度不等于复合操作原子性

给计数器加 volatile 后,多线程累加仍可能丢失更新,因为一次自增不是一个不可分割步骤。

给计数器加 volatile 后,多线程累加仍可能丢失更新,因为一次自增不是一个不可分割步骤。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 volatile 建立相关读写的可见性与顺序约束,但 count++ 包括读取、加一和写回。两...

透彻学习 JDK:wait 为什么必须放在 while 中

等待通知后条件未必仍然成立。

等待通知后条件未必仍然成立。生产者消费者模型里,通知只是重新检查条件的机会。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 wait 必须在持有对应监视器时调用,并在等待时释放该监视器。被唤醒后需要重新竞争锁,还可能经历虚假唤醒,或被其...

透彻学习 JDK:start 与 run 的线程边界

直接调用 run 能得到输出,却没有创建新的执行线程。

直接调用 run 能得到输出,却没有创建新的执行线程。线程实验要观察身份与执行顺序。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 start 请求启动新的线程并由虚拟机安排执行,run 只是普通方法入口。线程不能通过重复 start ...

透彻学习 JDK:字节流、字符流与乱码定位

中文读写乱码通常不是文件突然损坏,而是字节在错误的字符集下被解释。

中文读写乱码通常不是文件突然损坏,而是字节在错误的字符集下被解释。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 字节流传输原始字节,字符流通过编码器和解码器转换字符。默认字符集依赖运行环境,写入端与读取端没有显式约定时,同一份文件换机...

透彻学习 JDK:反射调用失败要看哪一层异常

反射方法存在,却仍然调用失败,可能是查找参数错误、访问限制,也可能是目标方法自身抛错。

反射方法存在,却仍然调用失败,可能是查找参数错误、访问限制,也可能是目标方法自身抛错。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 getMethod 按方法名和参数类型匹配公共方法,不会凭运行时值替你猜测签名。invoke 把目标方...

透彻学习 JDK:类加载器也参与类型身份

相同包名和类名的对象,仍可能无法互相转换。

相同包名和类名的对象,仍可能无法互相转换。排查插件和应用服务器问题时,要把类加载器纳入身份判断。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 运行时的类身份由二进制名称与定义它的类加载器共同确定。双亲委派通常先向父加载器请求,有助于共...

透彻学习 JDK:try-with-resources 怎样处理两个异常

读取文件失败时,关闭资源也可能失败。

读取文件失败时,关闭资源也可能失败。异常处理需要保留主要故障,而不是让关闭异常覆盖它。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 Java 7 的自动资源管理要求资源实现 AutoCloseable。多个资源按声明的反序关闭,主体异...

透彻学习 JDK:泛型擦除为何仍会出现类型转换错误

泛型在编译期帮助发现错误,但混入原始类型后,错误可能拖到读取元素时才暴露。

泛型在编译期帮助发现错误,但混入原始类型后,错误可能拖到读取元素时才暴露。 本文使用JDK 7,示例为方法体或类定义片段。源码学习需要区分语言规则、公共接口约定与某个版本的实现。本文把讨论范围固定在 Java 7,不把后续版本的集合结构或语法写进来。 1. 从现象推到机制 Java 的泛型主要通过擦除实现,运行时的普通 List 不保存每个类型参数的完整约束。编译器会在需要的位置插入强...