发布网友
共1个回答
热心网友
synchronized的实现分两种,一种是synchronized方法,一种是synchronized块,
两种方法稍有不同,但是核心还是一样的。
synchronized方法就像R大的笔记中提到的,
并没有生成对应的monitorenter、monitorexit字节码,
而是通过方法的access_flags字段中的ACC_SYNCHRONIZED标志来识别,
带有ACC_SYNCHRONIZED标志的方法在HotSpot中会通过method_entry_point_zerolocals_synchronized来触发,
在实际执行方法字节码之前会根据UseHeavyMonitors和UseBiasedLocking参数来确定
先用哪种锁,然后在方法返回时再做相关的解锁操作(体现在return字节码的汇编代码中)。
synchronized块有对应的monitorenter、monitorexit字节码,
monitorenter的汇编代码有一部分是跟method_entry_point_zerolocals_synchronized相同的,同样monitorexit的汇编代码有一部分也跟return的汇编代码相同。