protected void rehash(){
		while(load() > loadRehashThreshold) {
			//If we've completed all rehashing, we need to expand the table & reset
			//the counters.
			if(rehashComplete.compareAndSet(nLocks, nLocks+1)){
				completeExpansion(0);
				return;
			}
			
			//Otherwise, we attempt to grab the next index to process
			long stripeToRehash;
			while(true){
				stripeToRehash = rehashComplete.getAndIncrement();
				//If it's in the valid table range, we conceptually acquired a valid ticket
				if(stripeToRehash < nLocks) break;
				//Otherwise we're in the middle of a reset - spin until it has completed.
				while(rehashComplete.get() >= nLocks) {
					Thread.yield();
					if(load() < loadRehashThreshold) return;
				}
			}
			//We now have a valid ticket - we rehash all the indexes in the given stripe
			synchronized(lockForHash(stripeToRehash)){
				for(long idx = stripeToRehash; idx < tableLength; idx+=nLocks){
					rehashIdx(idx);
				}
			}
		}		
	}