code: synchronized public long generateIdTiny() {
          final long blockSize = 10000L; // block 10000 ms
          long timestamp = System.currentTimeMillis() / blockSize;
          long sequence = 0;
          boolean done = false;
          while (!done) {
              done = true;
              while (timestamp < lastTimestampMillisec.get() / blockSize) {
                  timestamp = waitTillNextTick(timestamp, blockSize);
              }
              if (timestamp == lastTimestampMillisec.get() / blockSize) {
                  sequence = sequenceTiny.incrementAndGet();
                  if (sequence > MAX_SEQUENCE_TINY) {
                      // reset sequence
                      sequenceTiny.set(sequence = 0);
                      timestamp = waitTillNextTick(timestamp, blockSize);
                      done = false;
                  }
              }
          }
          sequenceTiny.set(sequence);
          lastTimestampMillisec.set(timestamp * blockSize);
          timestamp -= TIMESTAMP_EPOCH / blockSize;
          return sequence == 0 ? timestamp
                  : (timestamp << SHIFT_TIMESTAMP_TINY) | (sequence & MASK_SEQUENCE_TINY);
      }
docs: Generates a tiny id (various bit long, does not include node info).
  
  <p>
  Format: {@code <41-bit:timestamp><0 or 16bit:sequence number>}. Where {@code timestamp} is in
  blocks of 10-second, minus the epoch.
  </p>
  
  <p>
  Note:
  <ul>
  <li>Tiny IDs are not distributed! IDs generated from different nodes can be duplicated since
  ID does not include node info.</li>
  <li>If IDs are generated at low rate (~1 ID per 10 seconds), then ID is "tiny" (41-bit
  long). Otherwise it is suffixed by a 16-bit sequence number.</li>
  <li>Hence, generated IDs may NOT be in ascending order!</li>
  </ul>
  </p>
  
  @return