`
xieyj
  • 浏览: 103124 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

openjdk中的同步代码

阅读更多

        在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 ;

                  }

        }

        整个获取锁的过程十分复杂,大大超出我的预料,大概是为了避免死锁这些,所以才设计了这么复杂,象是采用锁升级这种技术,锁的这几种状态是干什么用的,现在还弄不很清楚。

1
0
分享到:
评论
1 楼 hatedance 2012-02-01  
这个bytecodeInterpreter应该已经被遗弃了,现在都改用templateinterpreter了。

相关推荐

    jdk6&openjdk;源代码

    此外,源代码中的异常处理、同步机制、网络编程模型等也是重要的学习内容。 通过阅读和分析OpenJDK源代码,开发者不仅可以提高自己的编程技能,还能为开源社区贡献自己的力量,修复bug、提出改进方案,甚至参与新的...

    OpenJDK中rt.jar源码文件

    OpenJDK中的rt.jar文件是Java运行时库的核心组成部分,包含了Java标准类库(Java Standard Library)的大部分源代码。这个源码包对于开发者来说是一个宝贵的资源,它可以帮助我们深入理解Java API的工作原理,进行...

    BiSheng JDK 21 是 OpenJDK 21 的高性能生产就绪发行版

    在压缩包文件“bishengjdk-21-master”中,我们可以期待找到BiSheng JDK 21的源代码和构建脚本,这将帮助开发者理解并定制这个发行版。源代码仓库通常包括各个模块,如HotSpot虚拟机、JDK库、编译器以及测试套件。...

    openJDK-7.tar.gz

    描述提到"编译Android6.0源码需要的java工具包--openJDK,包括有jdk和jre",意味着这个openJDK-7是针对特定目的——编译Android 6.0(Marshmallow)操作系统源代码而准备的。它包含两个主要部分:JDK(Java开发工具...

    openjdk-8-src-b132-03_mar_2014-windows-native.zip

    在OpenJDK 8的Windows Native源代码中,开发者会使用JNI头文件定义本地方法,并通过`JNIEXPORT`和` JNICALL`宏来指定函数的导出和调用约定。JNI还提供了如`FindClass`, `GetStaticMethodID`等函数,帮助Java代码调用...

    openjdk-19(openjdk-19-ea+24_linux-x64_bin.tar.gz)

    它通过新的API使得异步任务可以以一种类似于同步代码的方式组织,从而减少回调地狱和资源泄漏的风险。 4. **Records Compact Form (JEP 409)**:在Java 14引入Records后,JEP 409进一步优化了记录类的字节码表示,...

    openjdk-11.0.9_linux-x64_bin.tar.gz

    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.ojdkbuild.x86_64.zip

    总的来说,Java 11 OpenJDK 11.0.8.10-1是Windows用户开发和运行Java应用程序的理想选择,它提供了一套完整的开发工具集,并且在开源社区的支持下持续更新和完善,确保了与最新技术的同步。无论你是初学者还是经验...

    openjdk-11.0.1_linux-x64_bin.tar.gz

    开发者可以利用OpenJDK 11.0.1中的`javac`编译器将源代码编译成字节码,`javadoc`生成文档,`jdb`进行调试,`jmap`和`jhat`进行内存分析,以及其他各种工具进行性能调优。 8. **兼容性与移植** 虽然OpenJDK ...

    openjdk12官方免费开源java jdk

    首先,OpenJDK的开放源代码特性意味着任何个人或组织都可以查看、学习、修改其源代码,并根据GPLv2许可证分发这些修改。这对于开发者而言是一个巨大的优势,因为它促进了透明度和创新,使得Java技术能够不断进步。 ...

    openjdk8 源码

    对于开发者而言,掌握OpenJDK8的源码有助于理解Java运行机制,优化代码性能,以及解决实际开发中的问题。本文将围绕"openjdk8源码"这一主题,详细阐述源码中的关键组件,特别是"sun.misc"包的内容,及其在JDK中的...

    openjdk-8u40-src-b25-10_feb_2015

    通过分析"openjdk-8u40-src-b25-10_feb_2015"这个版本的源码,不仅可以提升对Java平台的理解,也有助于开发者解决实际问题,优化应用程序,甚至参与到OpenJDK的开发和贡献中。对于Java开发者来说,这是一份宝贵的...

    gradle6.8.3 openJDK1.8.0_302 适合搭建spring5.3.10-SNAPSHOT源码环境

    在构建和管理Java项目时,Gradle和OpenJDK是两个至关重要的工具。这里我们讨论的是Gradle 6.8.3...通过使用Gradle 6.8.3和OpenJDK 1.8.0_302,你将拥有一个强大而稳定的开发环境,能够有效地理解和修改Spring的源代码。

    openJdk8+git2.32.zip

    2. 分布式特性:每个开发者都有完整的代码库副本,可以离线进行提交,再通过推送和拉取操作同步代码。 3. 版本历史:Git的版本历史记录详细且可搜索,可以轻松查看代码的修改历史和作者信息。 4. 数据安全:Git...

    Openjdk7master.zip

    5. **多线程与并发**:Java 的并发模型在 OpenJDK 7 中得到了很好的实现,包括线程池、锁、同步原语等,这些都是并发编程中的关键概念。 6. **内存模型与垃圾收集**:OpenJDK 7 的垃圾收集器,如 Parallel Scavenge...

    编译调试jvm, openjdk8源码, openjdk7, make3.81源码

    文件"jdk-sync-github-210728-jdk8-b100.zip"可能是一个从GitHub上同步下来的OpenJDK8更新,日期为2021年7月28日,版本b100。这可能是某个特定分支或者更新后的源代码,对于跟踪JVM的最新发展或者修复特定问题非常...

    java-11-openjdk-11.0.7.10-1.windows.redhat.x86_64.zip

    在本例中,我们讨论的是OpenJDK 11.0.7的特定版本,11.0.7.10-1,这是Red Hat发布的一个更新,特别针对Windows x86_64架构。 OpenJDK 11是一个长期支持(LTS)版本,这意味着它将得到更长时间的技术支持,这对于...

    openjdk hotspot源码

    Hotspot是OpenJDK中的一个JVM实现,其设计目标是提供高性能和低延迟。 Hotspot源码分为多个主要部分: 1. **Class File Parser**:这部分负责解析.class文件,将字节码转换为内部数据结构。它包含了对Java类和方法...

    openjdk-10_windows-x64_bin.tar.gz

    标题中的"openjdk-10_windows-x64_bin.tar.gz"指示这是一个针对64位Windows操作系统的OpenJDK 10二进制文件,采用tar.gz格式压缩。这种格式常见于Linux系统,但也可以在Windows上通过解压工具打开。文件名表明,这个...

    openjdk-1.6.0.41-src.x86_64

    通过研究这些源代码,开发者可以更深入地理解JVM的运行机制,特别是在类加载、内存管理、线程同步等关键领域。对于想要提升Java性能优化、故障排查能力的开发者来说,掌握OpenJDK的源码分析是必不可少的。 总的来说...

Global site tag (gtag.js) - Google Analytics