β

JDK 的源码你真的读懂了吗?

Harries Blog™ 52 阅读

如果看过JDK 源码 的同学基本上都看到过类似于下面的语句:

JDK 的源码你真的读懂了吗?

对“ final ReentrantLock lock = this.lock; ”这种写法不知道大家是啥感受,我当时看到是非常奇怪的,于是就搜索了一下,发现原作者对这种情况做了说明,原文如下:

JDK 的源码你真的读懂了吗?

其中第一句就提到了这样做的原因是:“ 归根究底是由于 内存模型 与OOP之间的原则不一致 ”,后面基本上都是对这句话做出说明。

要理解上面的内容必须要对Java的内存 模型 有所了解,Java的内存模型如下:

JDK 的源码你真的读懂了吗?

从上图我们可以知道Thread Stack 是以过程函数为访问对象,而不是以对象问访问的, 线程 栈内只有基本变量和指向对象的引用(对象本身是放在heap上)。

java 内存模型中可以看出,method只会存放对象引用(this指针),不会存放对象中的信息,只能再次通过this访问对象中的信息。

JDK 的源码你真的读懂了吗?

所以这种写法,在访问lock的时候首先去访问this对象,然后获取lock的引用,最后再调用lock函数,每次访问lock中的函数都是这3步。

但是如果采用将字段赋值给局部变量在使用,之后就不需要访问this指针,少了一步操作. 也就是说this对象和其他普通对象在函数没有任何区别

JDK 的源码你真的读懂了吗?

为了验证,可以对 代码 进行反 编译

JDK 的源码你真的读懂了吗?

反编译的结果和内存模型推断出来的完全一致。 虽然采用将字段赋值给局部变量在以后使用中确实能够节省 时间 ,但是目前的JDK版本对于这种情况下都做了优化。所以这种写法已经变成了 Doug Lea习惯了。

原文

https ://mp.weixin.qq.com/s/QGI1wIB4NYZW8Gf-xBpl5Q

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。 PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处: Harries Blog™ » JDK 的源码你真的读懂了吗?

作者:Harries Blog™
追心中的海,逐世界的梦
原文地址:JDK 的源码你真的读懂了吗?, 感谢原作者分享。

发表评论