a couple of things:

 * I think this should be it's own class that can be a singleton. We should have a TimeBasedUUID.java and RandomBasedUUID.java that way we can put in the right impl on initialisation time and don't need the if here.
 * if we have dedicated impls then we can simply use member variables rather than static variable.s
 * we should use a PaddedAtomicLong for the timestamp and update in a `CAS` loop like:
```Java
do {
  long last = lastTimestamp.get();
  if (lastTimeStamp.compareAndSet(last, timestamp) {
    break;
  } 
} while(last < timestamp);
```
 * I wonder if 32bit sequence IDs are enough?
 * do we really need the ByteBuffer instance of can we maybe just use a simple copy method for the bytes, the long should be simple as well just a static method with 4 shifts?