并发编程的历史综述与最新进展以及在HotSpot中的具体实现

ZHH2009 2014-08-11
to rink1969

full fence 对应【lock add dword ptr [esp], 0】
这个很好理理解,

HotSpot JVM里实现同步的的地方我目前看到的是用full fence(就是OrderAccess::fence())

下面两个才是困惑的:
load fence用 【mov eax, dword ptr [esp]】

store fence用 【volatile jint local_dummy = 0】

上面两个在src\share\vm\prims\unsafe.cpp
ZHH2009 2014-10-09
在Visual Studio中调试HotSpot VM的多线程代码有很多奇怪的问题,
比如按一次Step Into会影响两个线程,

通过Eclipse的远程调试功能来搭配Visual Studio更容易调试和模拟HotSpot VM中的多线程代码,
特别是hotspot\src\share\vm\runtime\objectMonitor.cpp中的一些代码分枝。

这篇文章讲述了如何结合Eclipse和Visual Studio来自上而下的全程调试Java和HotSpot VM中的C++代码:
http://hllvm.group.iteye.com/group/topic/41290
ZHH2009 2014-10-13
在设置BiasedLockingStartupDelay=0,
并使用-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y运行可调试版本的HotSpot VM时,如果通过Eclipse的远程调试功能运行下面的代码:
        synchronized (lock) {
            synchronized (lock) {
               //...
            }
        }


就算java代码中只有一个线程,偏向锁在两个synchronized中都执行了lock cmpxchg,
这跟偏向锁的设计意图不符,这是什么原因?
(观察到的结果是lock的mark word在执行完第一个synchronized之后第二个之前有被修改)

如果去掉-agentlib:jdwp,偏向锁就正确工作了,
只在第一个synchronized时执行一次lock cmpxchg,第二个synchronized就不执行了。

这个问题的对应OpenJDK8u代码是 MacroAssembler::biased_locking_enter
Global site tag (gtag.js) - Google Analytics