并发编程的历史综述与最新进展以及在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 |