偏向锁和轻量级锁

来源: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新值,   然后另外一边也是做同样的反向操作

0
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8442 学习 · 1872 问题

查看课程