偏向锁和轻量级锁
来源:9-3 synchronized底层实现原理-2

ShiveryMoon
2020-04-03
老师您好,请问:
1、首先是偏向锁,当一个线程尝试获取一个对象锁时,若发现该对象处于偏向锁状态,但当前线程ID不等于Mark Word的ThreadID时,此时,我看网上是说“利用CAS操作竞争锁”,请问这个CAS操作竞争具体是什么意思?compare什么swap什么?
2、同样对于这个轻量级锁,拷贝Mark word到锁记录成功后,虚拟机将使用“CAS操作尝试”将对象的Mark Word更新为指向Lock Record的指针,并将Lock record里的owner指针指向object mark word。请问这里的CAS又是指什么?compare什么swap什么?
望老师求解!
写回答
1回答
-
翔仔
2020-04-04
同学好,你的问题估计只能看源码
1.compare的是
// CAS替换对象头的mark word if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), mark) == mark) { if (PrintBiasedLockingStatistics) (* BiasedLocking::rebiased_lock_entry_count_addr())++; } else { // 重偏向失败,代表存在多线程竞争,则调用monitorenter方法进行锁升级 CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); }
cmpxchg_ptr方法第一个参数是预期修改后的值,第2个参数是修改的对象,第3个参数是预期原值,方法返回实际原值,所以compare的就是对象头原来的mark word内存地址,swap新的mark word内存地址
问题2.
if (call_vm || Atomic::cmpxchg_ptr(entry, lockee->mark_addr(), displaced) != displaced) { // 如果CAS替换不成功,代表锁对象不是无锁状态,这时候判断下是不是锁重入 // Is it simple recursive case? if (!call_vm && THREAD->is_lock_owned((address) displaced->clear_lock_bits())) { entry->lock()->set_displaced_header(NULL); } else { // CAS操作失败则调用monitorenter CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); } } if (mark->is_neutral()) { //设置Displaced Mark Word并替换对象头的mark word lock->set_displaced_header(mark); if (mark == (markOop) Atomic::cmpxchg_ptr(lock, obj()->mark_addr(), mark)) { TEVENT (slow_enter: release stacklock) ; return ; } }
这里的CAS就是compare原先的displaced原值,swap上markword新值, 然后另外一边也是做同样的反向操作
00