In the abstract class Storage, storageDirs is a protected variable and all its derived classes like NNStorage, JNStorage, DataStorage.. are iterating over this non-thread safe variable without any proper locks. Any parallel modification operation like add or remove volume can mutate the backing storageDirs list and any iterators on this list around the same time can face ConcurrentModificationException. It would be good to make the variable private and restrict the access via getters and setters. Any thread safe restriction need to be done can then be placed on the parent class only.
Also, NNStorage redefines parent class Storage's storageDirs, making it inconsistent with other derived classes. Would be cleaner if NNStorage can avoid re-defining it locally.