code: public synchronized void unlock()
    {
      if (tc.isEntryEnabled())
        SibTr.entry(tc, "unlock", this);
  
      // If the subscription locks are down to zero then notify the threads waiting
      // for the subscriptionTable lock.
      synchronized (iMutex)
      {
        // If we are exclusively locked, then just return, as long as
        // the thread that is calling is the thread that holds the
        // exclusive lock.
        if (iExclusivelyLocked && iExclusiveLockHolder == Thread.currentThread())
        {
          if (tc.isEntryEnabled())
            SibTr.exit(tc, "unlock");
          return;
        }
  
        // Decrement the lock count and notify the other threads if no 
        // one holds the lock any more.
        if (--iLockCount == 0)
          notifyAll();
          
        if (iLockCount < 0)
        {      
          if (tc.isEntryEnabled()) 
            SibTr.exit(tc, "unlock", "SIErrorException");
          
          SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0001",
            new Object[] {
              "com.ibm.ws.sib.processor.utils.LockManager",
              "1:196:1.19" });
            
          throw new SIErrorException(
            nls.getFormattedMessage(
              "INTERNAL_MESSAGING_ERROR_CWSIP0001",
              new Object[] {
                "com.ibm.ws.sib.processor.utils.LockManager",
                "1:203:1.19" },
              null));
        }        
      }
  
      if (tc.isEntryEnabled())
        SibTr.exit(tc, "unlock");
    }
docs: This method decrements the number of locks that are held