code: boolean assign(Work work, boolean self)
      {
          Work state = get();
          while (state.canAssign(self))
          {
              if (!compareAndSet(state, work))
              {
                  state = get();
                  continue;
              }
              // if we were spinning, exit the state (decrement the count); this is valid even if we are already spinning,
              // as the assigning thread will have incremented the spinningCount
              if (state.isSpinning())
                  stopSpinning();
  
              // if we're being descheduled, place ourselves in the descheduled collection
              if (work.isStop())
                  pool.descheduled.put(workerId, this);
  
              // if we're currently stopped, and the new state is not a stop signal
              // (which we can immediately convert to stopped), unpark the worker
              if (state.isStopped() && (!work.isStop() || !stop()))
                  LockSupport.unpark(thread);
              return true;
          }
          return false;
      }
docs: restores invariants of the various states (e.g. spinningCount, descheduled collection and thread park status)