- 浏览: 99910 次
- 性别:
- 来自: 武汉
最新评论
-
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 891在java里面使用动态 ... -
小议偏向锁
2009-02-02 22:18 1960java SE6采用偏向锁以提高性能。 个人理解,偏向 ... -
java中调用接口及调用继承类效率区别
2009-01-19 22:34 5087都说调用接口要比调 ... -
hotsphot中的ResourceArea
2008-11-09 21:38 1289在ClassLoader::load_cla ... -
athrow程序执行代码
2008-10-10 14:38 986看看openjdk中的athrow处理流程 { ... -
Object中notify方法
2008-10-08 10:48 2223Object.java类中notify调用的是shar ... -
Object中wait方法
2008-09-18 10:59 3593Object.wait调用 ... -
自定义类加载器loadClass
2008-09-17 15:43 1409自定义类加载器继承ClassLoader类,使用自定义类加载器 ... -
java栈帧中的对象引用
2008-09-12 11:14 3896openjdk中的java栈帧是如何布置的呢, ... -
System.gc初步分析
2008-09-11 09:48 4223openjdk中的垃圾回收是一个庞大的课题,如何标记 ... -
openjdk的周期线程
2008-09-10 10:04 1281openjdk中周期 ... -
java线程启动代码
2008-09-09 11:24 1950上次写了个《Th ... -
InterpreterRuntime::_new阅读
2008-09-05 14:52 1309InterpreterRuntime::_new为解释 ... -
java解释器的阅读
2008-09-05 10:09 1583前面已经提到了j ... -
JavaCalls::call代码阅读
2008-09-04 10:34 2785JavaCalls::call为hotspot调用j ... -
ClassFileParser::parseClassFile阅读
2008-09-02 11:29 1919instanceKlassHandle ClassF ... -
hotspot中的OO对象分析
2008-08-30 23:03 2139hotspot中的OO对象,涉 ... -
类的加载
2008-08-20 16:00 1235类通过(*env)->FindClass,也就是 ... -
Thread的调用
2008-08-19 11:03 2081在java里面创建线程new Thread().sta ... -
openJdk学习
2008-07-15 11:05 3533学习openJdk,主要 ...
相关推荐
openjdk6 源代码,分开也上传一份,省得太大了。
openjdk7源代码,从官方网站上搬过来的,方便大家下载!
openjdk8 源代码,分开也上传一份,省得太大了。
openjdk7 源代码,分开也上传一份,省得太大了。
openjdk9 源代码,分开也上传一份,省得太大了。
Win7下编译openjdk8源代码 完整版本 原创,希望对于想了解jvm底层的同仁有帮助。好的话,请点个赞。哈哈。
为了方便学习java,从网上下载了jdk10的源代码,并把它做成了chm格式,方便查看学习。如果没有积分也可以从网址http://hg.openjdk.java.net/下载没有做成CHM格式的源代码
jdk的完全开源版本openjdk6的源代码,大家可以下载下来学习一下。原本想0分分享呢,但是系统最小让选择2分,还望抱歉。
openjdk 6 7 8 9 源代码,编译源代码有作用。
OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)
OPENJDK中rt.jar源码,用于个人学习和ECLIPSE查看源码使用
openjdk-17源码(openjdk-17+35_src.zip)
openjdk-7u40的源代码。要深入JVM底层必须手动编译过JVM,并调试执行关键代码块。
openjdk不包含JMX中的可选元件SNMP部分的代码,而Icedtea则为这些不完整的部分开发了相同功能的源代码。 openjdk可以在商业上使用,而jdk只允许个人研究使用。 总的来说,openjdk是jdk的开源版本,两者在功能上略有...
openjdk11 full javafx
openjdk的所有原代码,共2卷,第2卷
openjdk的所有原代码,共2卷,第1卷
在ubuntu14.04中使用apt-get install得到的deb,包含: openjdk-8-jdk_8u91-b14-0ubuntu4~14.04_amd64.deb openjdk-8-jre_8u91-b14-0ubuntu4~14.04_amd64.deb openjdk-8-jdk-headless_8u91-b14-0ubuntu4~14.04_amd64...
OpenJDK源代码,便于程序员筒子们深入研究JDK运行机制
openJdk17