I have noticed that lock and grab are implemented under uvm_sequence_base and uvm_sequencer_base within the UVM BCL.
I have always seen a lock or a grab on a sequencer called from a sequence (virtual or standalone) like so -
this.lock(<sequencer>) - from a virtual sequence
p_sequencer.lock(this) - from a running standalone sequence
Can somebody explain the calls to the lock/grab under the sequencer? How is it different?