throw new IllegalMonitorStateException();
throw new IllegalMonitorStateException("unlocking " + o);
  static void unlock (Object o) {    VM_Magic.pragmaNoInline();    VM_Magic.sync(); // prevents stale data from being seen by next owner of the lock    while (true) { // spurious contention detected      int oldStatus = VM_Magic.prepare(o, OBJECT_STATUS_OFFSET);      int id  = oldStatus & (OBJECT_THREAD_ID_MASK | OBJECT_FAT_LOCK_MASK);      if (id != VM_Magic.getThreadId()) { // not normal case	if ((oldStatus & OBJECT_FAT_LOCK_MASK) != 0) { // o has a heavy lock	  int index = oldStatus & OBJECT_LOCK_ID_MASK;	  index >>>= OBJECT_LOCK_ID_SHIFT;	  VM_Scheduler.locks[index].unlockHeavy(o); // note that unlockHeavy has issued a sync	  return;	} 	VM_Scheduler.trace("VM_Lock", "unlock error: status = ", oldStatus);	throw new IllegalMonitorStateException();      }      int countbits = oldStatus & OBJECT_LOCK_COUNT_MASK; // get count      if (countbits == 0) { // this is the last lock	int newStatus = oldStatus & OBJECT_UNLOCK_MASK;	if (VM_Magic.attempt(o, OBJECT_STATUS_OFFSET, oldStatus, newStatus)) {	  return; // unlock succeeds        }         continue;      }      // more than one lock      int newStatus = oldStatus - OBJECT_LOCK_COUNT_UNIT; // decrement recursion count      if (VM_Magic.attempt(o, OBJECT_STATUS_OFFSET, oldStatus, newStatus)) {	return; // unlock succeeds      }    }  }