- 浏览: 103061 次
- 性别:
- 来自: 武汉
最新评论
-
hatedance:
这个bytecodeInterpreter应该已经被遗弃了,现 ...
openjdk中的同步代码 -
Mr_lee_2012:
是啊,好文章,谢过。
java栈帧中的对象引用 -
ZangXT:
有些性能要求比较高的系统会考虑这一点的,典型的如JPC,尽量避 ...
java中调用接口及调用继承类效率区别 -
tinywind:
你有没有注意到load_classfile开始定义了个Reso ...
hotsphot中的ResourceArea -
qianli-2010:
java中调用接口及调用继承类效率区别
在java虚拟机中的方法同步synchronized,是通过使用monitorenter和monitorexit这两个操作码,当虚拟机遇到monitorenter的时候,它会获得栈中objectref所引用的对象的锁。如果线程已经拥有那个对象的锁,锁的计数器加1,线程中每个monitorexit会引起计数器减1,当计数器为0时候,监视器就释放了。
先看看openjdk中的monitorenter代码(bytecodeInterpreter.cpp)
{
if (entry != NULL) { //获取一个空闲的监视器
entry->set_obj(lockee);
markOop displaced = lockee->mark()->set_unlocked();
entry->lock()->set_displaced_header(displaced);
if (Atomic::cmpxchg_ptr(entry, lockee->mark_addr(), displaced) != displaced) {
if (THREAD->is_lock_owned((address) displaced->clear_lock_bits())) {
entry->lock()->set_displaced_header(NULL);
} else {
CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception);
}
}
UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);
} else { //监视器为空,重试
istate->set_msg(more_monitors);
UPDATE_PC_AND_RETURN(0); // Re-execute
}
}
看一下InterpreterRuntime::monitorenter,
void InterpreterRuntime::monitorenter(JavaThread* thread, BasicObjectLock* elem){
.......
Handle h_obj(thread, elem->obj());
ObjectSynchronizer::slow_enter(h_obj, elem->lock(), CHECK);
}
slow_enter调用下面的inflate
ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
for (;;) {
const markOop mark = object->mark() ;
/*
mark有几种状态,inflated直接返回,Stack-locked转换为inflated,
INFLATING 不断等待直到完成,Neutral 锁升级?
*/
//inflated 状态
if (mark->has_monitor()) { //已经获得锁,直接返回
ObjectMonitor * inf = mark->monitor() ;
return inf ;
}
if (mark == markOopDesc::INFLATING()) {
ReadStableMark(object) ; //不断检测,超过一定次数睡眠
continue ;
}
//stack locked 状态
if (mark->has_locker()) {
ObjectMonitor * m = omAlloc (Self) ;
markOop cmp = (markOop) Atomic::cmpxchg_ptr (markOopDesc::INFLATING(), object->mark_addr(), mark) ; //将object->mark_addr()和mark比较,如果这两个值相等,则将object->mark_addr()改成markOopDesc::INFLATING(),值比较相等返回是mark,不相等返回的是object->mark_addr(), 比较和赋值是一个原子操作
if (cmp != mark) { //不断检测值,自旋锁的用法
omRelease (Self, m) ;
continue ; // 重新进行循环
}
markOop dmw = mark->displaced_mark_helper() ;
m->set_header(dmw) ; //设置mark->has_monitor()?也就是inflated 状态
...............
return m ;
}
//Neutral状态
m->set_header(mark);
if (Atomic::cmpxchg_ptr (markOopDesc::encode(m), object->mark_addr(), mark) != mark) {//在此又做了一次检测,到底是何目的?
continue ;
}
............
if (_sync_Inflations != NULL) _sync_Inflations->inc() ; //增加计数
return m ;
}
}
整个获取锁的过程十分复杂,大大超出我的预料,大概是为了避免死锁这些,所以才设计了这么复杂,象是采用锁升级这种技术,锁的这几种状态是干什么用的,现在还弄不很清楚。
发表评论
-
java动态代理
2009-11-19 16:21 933在java里面使用动态 ... -
小议偏向锁
2009-02-02 22:18 2034java SE6采用偏向锁以提高性能。 个人理解,偏向 ... -
java中调用接口及调用继承类效率区别
2009-01-19 22:34 5186都说调用接口要比调 ... -
hotsphot中的ResourceArea
2008-11-09 21:38 1342在ClassLoader::load_cla ... -
athrow程序执行代码
2008-10-10 14:38 1042看看openjdk中的athrow处理流程 { ... -
Object中notify方法
2008-10-08 10:48 2283Object.java类中notify调用的是shar ... -
Object中wait方法
2008-09-18 10:59 3663Object.wait调用 ... -
自定义类加载器loadClass
2008-09-17 15:43 1454自定义类加载器继承ClassLoader类,使用自定义类加载器 ... -
java栈帧中的对象引用
2008-09-12 11:14 3948openjdk中的java栈帧是如何布置的呢, ... -
System.gc初步分析
2008-09-11 09:48 4314openjdk中的垃圾回收是一个庞大的课题,如何标记 ... -
openjdk的周期线程
2008-09-10 10:04 1328openjdk中周期 ... -
java线程启动代码
2008-09-09 11:24 2004上次写了个《Th ... -
InterpreterRuntime::_new阅读
2008-09-05 14:52 1378InterpreterRuntime::_new为解释 ... -
java解释器的阅读
2008-09-05 10:09 1629前面已经提到了j ... -
JavaCalls::call代码阅读
2008-09-04 10:34 2853JavaCalls::call为hotspot调用j ... -
ClassFileParser::parseClassFile阅读
2008-09-02 11:29 2008instanceKlassHandle ClassF ... -
hotspot中的OO对象分析
2008-08-30 23:03 2194hotspot中的OO对象,涉 ... -
类的加载
2008-08-20 16:00 1288类通过(*env)->FindClass,也就是 ... -
Thread的调用
2008-08-19 11:03 2149在java里面创建线程new Thread().sta ... -
openJdk学习
2008-07-15 11:05 3584学习openJdk,主要 ...
相关推荐
此外,源代码中的异常处理、同步机制、网络编程模型等也是重要的学习内容。 通过阅读和分析OpenJDK源代码,开发者不仅可以提高自己的编程技能,还能为开源社区贡献自己的力量,修复bug、提出改进方案,甚至参与新的...
OpenJDK中的rt.jar文件是Java运行时库的核心组成部分,包含了Java标准类库(Java Standard Library)的大部分源代码。这个源码包对于开发者来说是一个宝贵的资源,它可以帮助我们深入理解Java API的工作原理,进行...
在压缩包文件“bishengjdk-21-master”中,我们可以期待找到BiSheng JDK 21的源代码和构建脚本,这将帮助开发者理解并定制这个发行版。源代码仓库通常包括各个模块,如HotSpot虚拟机、JDK库、编译器以及测试套件。...
描述提到"编译Android6.0源码需要的java工具包--openJDK,包括有jdk和jre",意味着这个openJDK-7是针对特定目的——编译Android 6.0(Marshmallow)操作系统源代码而准备的。它包含两个主要部分:JDK(Java开发工具...
在OpenJDK 8的Windows Native源代码中,开发者会使用JNI头文件定义本地方法,并通过`JNIEXPORT`和` JNICALL`宏来指定函数的导出和调用约定。JNI还提供了如`FindClass`, `GetStaticMethodID`等函数,帮助Java代码调用...
它通过新的API使得异步任务可以以一种类似于同步代码的方式组织,从而减少回调地狱和资源泄漏的风险。 4. **Records Compact Form (JEP 409)**:在Java 14引入Records后,JEP 409进一步优化了记录类的字节码表示,...
2. **HTTP客户端API**:Java 11中新增了内置的HTTP客户端API(java.net.http),替代了原有的sun.net.www.http.HttpClient,提供了异步和同步两种操作模式,支持HTTP/2协议,增强了网络通信能力。 3. **静态局部...
总的来说,Java 11 OpenJDK 11.0.8.10-1是Windows用户开发和运行Java应用程序的理想选择,它提供了一套完整的开发工具集,并且在开源社区的支持下持续更新和完善,确保了与最新技术的同步。无论你是初学者还是经验...
开发者可以利用OpenJDK 11.0.1中的`javac`编译器将源代码编译成字节码,`javadoc`生成文档,`jdb`进行调试,`jmap`和`jhat`进行内存分析,以及其他各种工具进行性能调优。 8. **兼容性与移植** 虽然OpenJDK ...
首先,OpenJDK的开放源代码特性意味着任何个人或组织都可以查看、学习、修改其源代码,并根据GPLv2许可证分发这些修改。这对于开发者而言是一个巨大的优势,因为它促进了透明度和创新,使得Java技术能够不断进步。 ...
对于开发者而言,掌握OpenJDK8的源码有助于理解Java运行机制,优化代码性能,以及解决实际开发中的问题。本文将围绕"openjdk8源码"这一主题,详细阐述源码中的关键组件,特别是"sun.misc"包的内容,及其在JDK中的...
通过分析"openjdk-8u40-src-b25-10_feb_2015"这个版本的源码,不仅可以提升对Java平台的理解,也有助于开发者解决实际问题,优化应用程序,甚至参与到OpenJDK的开发和贡献中。对于Java开发者来说,这是一份宝贵的...
在构建和管理Java项目时,Gradle和OpenJDK是两个至关重要的工具。这里我们讨论的是Gradle 6.8.3...通过使用Gradle 6.8.3和OpenJDK 1.8.0_302,你将拥有一个强大而稳定的开发环境,能够有效地理解和修改Spring的源代码。
2. 分布式特性:每个开发者都有完整的代码库副本,可以离线进行提交,再通过推送和拉取操作同步代码。 3. 版本历史:Git的版本历史记录详细且可搜索,可以轻松查看代码的修改历史和作者信息。 4. 数据安全:Git...
5. **多线程与并发**:Java 的并发模型在 OpenJDK 7 中得到了很好的实现,包括线程池、锁、同步原语等,这些都是并发编程中的关键概念。 6. **内存模型与垃圾收集**:OpenJDK 7 的垃圾收集器,如 Parallel Scavenge...
文件"jdk-sync-github-210728-jdk8-b100.zip"可能是一个从GitHub上同步下来的OpenJDK8更新,日期为2021年7月28日,版本b100。这可能是某个特定分支或者更新后的源代码,对于跟踪JVM的最新发展或者修复特定问题非常...
在本例中,我们讨论的是OpenJDK 11.0.7的特定版本,11.0.7.10-1,这是Red Hat发布的一个更新,特别针对Windows x86_64架构。 OpenJDK 11是一个长期支持(LTS)版本,这意味着它将得到更长时间的技术支持,这对于...
Hotspot是OpenJDK中的一个JVM实现,其设计目标是提供高性能和低延迟。 Hotspot源码分为多个主要部分: 1. **Class File Parser**:这部分负责解析.class文件,将字节码转换为内部数据结构。它包含了对Java类和方法...
标题中的"openjdk-10_windows-x64_bin.tar.gz"指示这是一个针对64位Windows操作系统的OpenJDK 10二进制文件,采用tar.gz格式压缩。这种格式常见于Linux系统,但也可以在Windows上通过解压工具打开。文件名表明,这个...
通过研究这些源代码,开发者可以更深入地理解JVM的运行机制,特别是在类加载、内存管理、线程同步等关键领域。对于想要提升Java性能优化、故障排查能力的开发者来说,掌握OpenJDK的源码分析是必不可少的。 总的来说...