// The mark can be in one of the following states: Mark Word可能有以下几种状态:
// * Inflated - just return * Inflated (膨胀完成) - 这种状态说明该锁已经是重量级锁了,不需要膨胀,直接返回
// * Stack-locked - coerce it to inflated * Stack-locked (轻量级锁) - 需要执行膨胀操作
// * INFLATING - busy wait for conversion to complete * INFLATING (膨胀中) - 正在膨胀中
// * Neutral - aggressively inflate the object. * Neutral (无锁) - 强制执行膨胀操作
// * BIASED - Illegal. We should never see this * BIASED (偏向锁) - 出现偏向锁是不合理的,需要抛出异常
int ObjectMonitor::TryLock (Thread * Self) {
for (;;) { // 无限循环
void * own = _owner ;
// 当前 ObjectMonitor 对象的 _owner 不为 NULL,说明「重量级锁」已被其他线程持有,返回 0
if (own != NULL) return 0 ;
// 当前 ObjectMonitor 对象的 _owner 为 NULL,说明重量级锁可以竞争获取
// CAS 操作以「NULL」作为比较值,以「当前线程指针地址」作为替换值,进行设置「当前 ObjectMonitor 对象的 _owner」内存值
// CAS 成功,说明获取到「重量级锁」,返回 1
if (Atomic::cmpxchg_ptr (Self, &_owner, NULL) == NULL) {
// Either guarantee _recursions == 0 or set _recursions = 0.
assert (_recursions == 0, "invariant") ;
assert (_owner == Self, "invariant") ;
// CONSIDER: set or assert that OwnerIsThread == 1
return 1 ;
}
// The lock had been free momentarily, but we lost the race to the lock.
// Interference -- the CAS failed.
// We can either return -1 or retry.
// Retry doesn't make as much sense because the lock was just acquired.
// CAS 失败,说明其他线程刚刚 CAS 成功设置获取到「重量级锁」,此时没有必要进行自旋,直接返回 -1
if (true) return -1 ;
}
}
IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorexit(JavaThread* thread, BasicObjectLock* elem))
#ifdef ASSERT
thread->last_frame().interpreter_frame_verify_monitor(elem);
#endif
Handle h_obj(thread, elem->obj());
assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
"must be NULL or an object");
if (elem == NULL || h_obj()->is_unlocked()) {
THROW(vmSymbols::java_lang_IllegalMonitorStateException());
}
// 直接调用 slow_exit
ObjectSynchronizer::slow_exit(h_obj(), elem->lock(), thread);
// Free entry. This must be done here, since a pending exception might be installed on
// exit. If it is not cleared, the exception handling code will try to unlock the monitor again.
elem->set_obj(NULL);
#ifdef ASSERT
thread->last_frame().interpreter_frame_verify_monitor(elem);
#endif
IRT_END
synchronized 分析
膨胀成重量锁 (创建 ObjectMonitor 对象)
ObjectSynchronizer::inflate 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/synchronizer.cpp#L1249-L1447
获取重量级锁
ObjectMonitor::enter 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/objectMonitor.cpp#L321-L483
ObjectMonitor::TrySpin_VaryDuration 方法 | 自适应自旋
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/objectMonitor.cpp#L2021-L2244
ObjectMonitor::TryLock 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/objectMonitor.cpp#L489-L506
ObjectMonitor:: EnterI 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/objectMonitor.cpp#L508-L747
ObjectWaiter 定义
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/objectMonitor.hpp#L38-L56
ObjectMonitor::UnlinkAfterAcquire 方法 | 将封装了当前线程的 ObjectWaiter node 节点从「等待队列 _cxq」或「等待队列 _EntryList」中移除
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/objectMonitor.cpp#L848-L909
释放重量级锁
bytecodeInterpreter 方法 bytecodeInterpreter | #define ARRAY_STOREFROM64 | CASE(_monitorexit)
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp#L1923-L1953
InterpreterRuntime::monitorexit 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp#L645-L662
ObjectSynchronizer::slow_exit 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/synchronizer.cpp#L272-L274
ObjectSynchronizer:: fast_exit 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/synchronizer.cpp#L186-L222
ObjectMonitor::exit 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/objectMonitor.cpp#L962-L1284
ObjectMonitor::ExitEpilog 方法
源码: https://github.com/openjdk/jdk8u/blob/master/hotspot/src/share/vm/runtime/objectMonitor.cpp#L1333-L1365