超人汪小建(seaboat)
公众号:【远洋号】,笔名seaboat,擅长工程算法、人工智能算法、自然语言处理、计算机视觉、架构、分布式、高并发、大数据和搜索引擎等方面的技术,大多数编程语言都会使用,但更擅长Java、Python和C++。平时喜欢编程、绘画、看书、写作和运动,擅长素描、篮球、跑步、游泳、健身和羽毛球等运动项目。崇尚技术自由,崇尚思想自由。出版书籍:《Tomcat内核设计剖析》、《图解数据结构与算法》、《图解Java并发原理》、《人工智能原理科普》。
展开
-
JDK不同操作系统的FileSystem(Windows)上篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-11-13 16:05:59 · 2248 阅读 · 1 评论 -
从JDK源码角度看Short
概况Java的Short类主要的作用就是对基本类型short进行封装,提供了一些处理short类型的方法,比如short到String类型的转换方法或String类型到short类型的转换方法,当然也包含与其他类型之间的转换方法。继承结构--java.lang.Object --java.lang.Number --java.lang.Short主要属性public static fin原创 2017-08-01 20:25:31 · 3181 阅读 · 0 评论 -
从JDK源码角度看java并发的公平性
JAVA为简化开发者开发提供了很多并发的工具,包括各种同步器,有了JDK我们只要学会简单使用类API即可。但这并不意味着不需要探索其具体的实现机制,本文从JDK源码角度简单讲讲并发时线程竞争的公平性。 所谓公平性指所有线程对临界资源申请访问权限的成功率都一样,不会让某些线程拥有优先权。我们知道CLH Node FIFO等待队列是一个先进先出的队列,那么是否就可以说每条线程获取锁时就是原创 2016-05-11 08:25:39 · 4436 阅读 · 0 评论 -
从JDK源码角度看Byte
Java的Byte类主要的作用就是对基本类型byte进行封装,提供了一些处理byte类型的方法,比如byte到String类型的转换方法或String类型到byte类型的转换方法,当然也包含与其他类型之间的转换方法。主要实现代码如下:public final class Byte extends Number implements Comparable<Byte> { public stati原创 2017-07-06 15:39:05 · 3595 阅读 · 3 评论 -
从 JDK 源码角度看 Boolean
Java的Boolean类主要作用就是对基本类型boolean进行封装,提供了一些处理boolean类型的方法,比如String类型和boolean类型的...原创 2017-06-16 19:58:11 · 158 阅读 · 0 评论 -
从JDK源码角度看线程的阻塞和唤醒
目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合、wait与notify组合、park与unpark组合。其中suspend与resume因为存在无法解决的竟态问题而被Java废弃,同样,wait与notify也存在竟态条件,wait必须在notify之前执行,假如一个线程先执行notify再执行wait将可能导致一个线程永远阻塞,如此一来,必须要提出另外一种原创 2016-05-21 08:39:41 · 5983 阅读 · 0 评论 -
从JDK源码角度看线程池原理
“池”技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实现类由不同厂商实现,数据库连接的建立和销毁都是很耗时耗资源的操作,为了查询数据库中某条记录,最原始的一个过程是建立连接、发送查询语句、返回查询结果、销毁连接,假如仅仅是一个很简单的查询语句,那么可能建立连接与销毁连接两个原创 2016-05-15 09:01:40 · 6675 阅读 · 0 评论 -
从JDK源码角度看java并发的原子性如何保证
JDK源码中,在研究AQS框架时,会发现很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,java被隔离在硬件之上,明显力不从心,这时为了能直接操作操作系统层面,肯定要通过用C++编写的native本地方法来扩展实现。JDK提供了一个类来满足CAS的要求,sun.misc.Unsafe,从名字上可以大概知道它用于执行低级别、不安全的操作,AQS就是使用此类完原创 2016-05-10 08:35:27 · 5550 阅读 · 0 评论 -
从JDK源码看Java并发特性
索引下前面写的篇关于从JDK源码看Java并发特性的文章 文章列表 从JDK源码角度看java并发的原子性如何保证 从JDK源码角度看java并发的公平性 从JDK源码角度看java并发线程的中断 从JDK源码角度看并发竞争的超时 从JDK源码角度看并发锁的优化 从JDK源码角度看线程的阻塞和唤醒 从JDK源码角度看线程池原理原创 2017-02-19 20:58:12 · 1380 阅读 · 0 评论 -
从 JDK 源码角度看 Java 并发的公平性
Java为简化开发者开发提供了很多并发的工具,包括各种同步器,有了JDK我们只要学会简单使用类API即可。但这并不意味着不需要探索其具体的实现机制,本文从...原创 2017-04-13 19:45:55 · 147 阅读 · 0 评论 -
从JDK源码角度看并发锁的优化
在CLH锁核心思想的影响下,JDK并发包以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能。比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用;在等待机制上由原来的自旋改成阻塞唤醒。如图,原创 2016-05-19 17:01:30 · 5941 阅读 · 0 评论 -
从 JDK 源码角度看 java 并发线程的中断
线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使...原创 2017-05-12 19:38:40 · 207 阅读 · 0 评论 -
从JDK源码角度看Boolean
Java的Boolean类主要作用就是对基本类型boolean进行封装,提供了一些处理boolean类型的方法,比如String类型和boolean类型的转换。主要实现源码如下:public final class Boolean implements java.io.Serializable, Comparable<Boolean> { private final boolean value;原创 2017-06-16 19:07:38 · 3007 阅读 · 0 评论 -
JDK不同操作系统的FileSystem(Windows)中篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-11-20 08:32:05 · 2048 阅读 · 0 评论 -
从JDK源码角度看并发竞争的超时
JDK中的并发框架提供的另外一个优秀机制是锁获取超时的支持,当大量线程对某一锁竞争时可能导致某些线程在很长一段时间都获取不了锁,在某些场景下可能希望如果线程在一段时间内不能成功获取锁就取消对该锁的等待以提高性能,这时就需要用到超时机制。在JDK1.5之前并没有对此支持,当时的并发控制职能通过JVM内置的synchronized关键词实现锁,但对一些特殊要求却力不从心,例如超时取消控制。JDK1.5原创 2016-05-17 08:31:39 · 5867 阅读 · 0 评论 -
JDK源码角度看并发锁的优化
在CLH锁核心思想的影响下,JDK并发包以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能。比起原来的CLH锁已经做了很大的改造,...原创 2017-05-04 19:59:30 · 86 阅读 · 0 评论 -
从JDK源码角度看java并发线程的中断
线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止。在java中要让线程安全、快速、可靠地停下来并不是一件容易的事,java也没有提供任何可靠的方法终止线程的执行。 线程调度策略中有抢占式和协作式两个概念,与之类似的是中断机制也有协作式和抢占式。 历史上Jav原创 2016-05-13 17:52:30 · 6931 阅读 · 0 评论 -
从JDK源码角度看Object
Java的Object是所有其他类的父类,从继承的层次来看它就是最顶层根,所以它也是唯一一个没有父类的类。它包含了对象常用的一些方法,比如getClass、hashCode、equals、clone、toString、notify、wait等常用方法。所以其他类继承了Object后就可以不用重复实现这些方法。这些方法大多数是native方法,下面具体分析。主要的代码如下:public class O原创 2017-06-26 19:53:06 · 4216 阅读 · 2 评论 -
JDK并发AQS系列(三)
锁的获取与释放在数据竞争情况下,一个线程只有在成功获取锁后才能继续往下执行,当离开竞争区域时将释放锁,释放的锁供其他即将进入数据竞争区域的线程获取。同步器一般用acqui...原创 2018-10-18 08:00:00 · 154 阅读 · 0 评论 -
从JDK角度看对象克隆
对象克隆对象克隆其实是很常见的操作,它完成的功能是将现有对象内容(属性)拷贝到新的对象中,得到的是一个新的对象,而并不只是一个对象引用。其实对于属性不多的对象我们可以直接通过编写代码逐一属性复制,比如我们可以直接 new 一个新对象,然后通过 set 方法将属性值一个个设置进去。但这种做法我们也是比较不屑,看起来不够高端,而且字段一多就会造成代码冗长。另外,可能有些私有变量也无法这样拷贝,...原创 2018-02-23 08:34:09 · 1684 阅读 · 0 评论 -
从JDK角度认识枚举enum
前言对于比较稳定的值集合,Java 提供了枚举来定义,通过它可以很方便管理集合。那么 Java 的枚举是通过怎样的机制实现的?本文将从 JDK 角度来看看枚举的原理。定义枚举使用很简单,比如定义一个表示“环保”、“交通”、“手机”三个值的集合,那么就可以直接定义如下,然后可直接 Labels.ENVIRONMENT 使用,public enum Labels { E原创 2018-01-12 09:04:12 · 1534 阅读 · 0 评论 -
JDK并发AQS系列(二)
原子性在研究JDK中AQS时,会发现这个类很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,java被隔离在硬件之上,明显力不从心...原创 2018-10-12 08:00:00 · 142 阅读 · 0 评论 -
JDK不同操作系统的FileSystem(unix-like)下篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-12-10 12:52:09 · 2549 阅读 · 0 评论 -
JDK并发AQS系列(一)
历史1995年sun公司发布了第一个java语言版本,可以说从jdk1.1到jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型...原创 2018-09-30 08:00:00 · 148 阅读 · 0 评论 -
synchronized与JDK同步器不够用?用AQS构建同步器
跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理。作者简介:笔名seaboat,擅长工程算法、人工智能算法、自然语言处理、架构、分布式、高并发、大数据和搜索引擎等方面的技术,大多数编程语言都会使用,但更擅长Java、Python和C++。平时喜欢看书写作、运动、画画。崇尚开源,崇尚技术自由,更崇尚思想自由。出版书籍:《Tomcat内核设计剖析》、《图解数据结构与算法》、《图解Java并发原理》、《人工智能原理科普》。从同步说起线程与线程之间的通信协作最原始的方案是.原创 2020-08-20 09:16:08 · 273 阅读 · 0 评论 -
JDK不同操作系统的FileSystem(unix-like)上篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-12-08 09:21:08 · 2715 阅读 · 1 评论 -
JDK不同操作系统的FileSystem(Windows)下篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-11-30 11:35:39 · 1293 阅读 · 0 评论 -
JDK不同操作系统的FileSystem(unix-like)中篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-12-09 21:38:08 · 3317 阅读 · 0 评论 -
JDK并发AQS系列(五)
CLH锁的改进鉴于自旋锁的不足,Craig,Landin,Hagersten发明了CLH锁。而在CLH锁核心思想的影响下,Java并发包的基础框架AQS以CLH锁作为基础...原创 2018-11-01 08:00:00 · 151 阅读 · 0 评论 -
JDK不同操作系统的FileSystem(Windows&Unix-like)
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-12-12 14:52:37 · 1942 阅读 · 0 评论 -
JDK并发AQS系列(四)
自旋锁的不足前面说到用自旋方式来获取锁,能有效避免线程挂起和恢复。但它也有不足之处:仅适用于占用时间短、颗粒度很小的情景。需要硬件级别的原子操作。它无法保证公平性。每次读...原创 2018-10-25 08:00:00 · 180 阅读 · 0 评论 -
从JDK源码角度看Long
概况Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其他类型之间的转换方法。除此之外还有一些位相关的操作。继承结构--java.lang.Object --java.lang.Number --java.lang.Long主要属性public s原创 2017-09-19 10:06:48 · 5211 阅读 · 3 评论 -
从JDK源码看System.exit
前言在编写的Java程序中有时会遇到用 System.exit 来关闭JVM,其中调用 exit 方法时会包含一个状态参数n,即System.exit(n)。这其实是一个约定值,如果为0则表示正常关闭,而非0则表示非正常关闭。这里我们从JDK源码看下不同状态都是怎么处理的。System与Runtime先看System类的exit方法如下,可以看到它是间接调用了Runtime对象的exit方法。pub原创 2017-10-16 08:38:10 · 1621 阅读 · 0 评论 -
2018汇总JDK源码篇
从JDK源码看String(上)从JDK源码看String(下)从JDK源码看StringBuffer从JDK源码看StringBuilder从JDK源码看Java域名解...转载 2019-01-15 09:19:58 · 432 阅读 · 0 评论 -
2017文章汇总——JDK源码篇
2018已经开始,可能还有360天结束。 Eventually a single thing can only get so big. You need t...原创 2018-01-06 10:53:13 · 161 阅读 · 0 评论 -
从JDK源码看InputStream
概况JDK 给我们提供了很多实用的输入流 xxxInputStream,而 InputStream 是所有字节输入流的抽象。包括 ByteArrayInputStream 、FilterInputStream 、BufferedInputStream 、DataInputStream 和 PushbackInputStream 等等。继承结构--java.lang.Object --java.i原创 2017-11-07 10:53:17 · 2070 阅读 · 0 评论 -
从JDK源码角度看并发的原子性如何保证
JDK源码中,在研究AQS框架时,会发现很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,Java被隔离在硬件之上...原创 2017-08-08 20:00:00 · 188 阅读 · 0 评论 -
从JDK源码看Java域名解析
前言在互联网中通信需要借助 IP 地址来定位到主机,而 IP 地址由很多数字组成,对于人类来说记住某些组合数字很困难,于是,为了方便大家记住某地址而引入主机名和域名。早期的网络中的机器数量很少,能很方便地通过 hosts 文件来完成主机名称和 IP 地址的映射,这种方式需要用户自己维护网络上所有主机的映射关系。后来互联网迅猛发展起来,hosts 文件方式已经无法胜任,于是引入域名系统(DN...原创 2018-03-03 08:44:37 · 2862 阅读 · 0 评论 -
从JDK源码看Writer
概况Writer 是一个用于写字符流的抽象类,它将一些相通的写相关操作抽象到此类,方便各种写操作类的实现。一般来说子类只需要实现它的 write、flush 、close 等三个方法,但如果有需要还可以重写 Writer 提供的公共方法。JDK 在 Writer 的基础上实现了很多有用的 xxxWriter ,包括 BufferedWriter、CharArrayWriter、FilterWrite原创 2017-10-30 09:18:56 · 1144 阅读 · 0 评论 -
从JDK源码看字节流和字符流
在各种 IO 中都会涉及到流的概念,比如网络 IO、磁盘IO、内存IO或其他设备IO,于是抽象出流概念,可以分为两大类:输出流和输入流。有了这些抽象就能很方便表达网络从某端传输到另外一端,或对磁盘进行读写操作。而 Java 还分出字节流和字符流,对字节和字符提供了方便的操作。从JDK源码看InputStream从JDK源码看OutputStream从JDK源码看Writer从JDK源码看Reader原创 2017-12-19 09:45:18 · 1594 阅读 · 0 评论