Я думаю, что ThreadLocal может быть тем, что вам нужно, хотя некоторые могут посчитать, что этот подход является нарушением цели ThreadLocal или хорошим дизайном. Что-то вроде:
public class MyIDManager {
public static final ThreadLocal<Long> myID = new ThreadLocal<Long>();
}
...
// set ID at some point
MyIDManager.myID.set(theNewID);
...
// read it later
long currentID = MyIDManager.get();
Волшебство здесь в том, что значение myID действительно специфично для потока и будет отличаться при доступе из разных потоков.
После этого вы можете делать с идентификатором все, что захотите, включая его регистрацию.