Thank you Jason Lowe .
I thought of making the list volatile. Here is a scenario which I felt could be a problem.
Thread T1 comes into initialize() , calls initProviderList(), checks that the list is null, which is true the first(few) times. It gets into the sync block, since no one is in there. T1 hasn't finished populating the list but has initialized it (so now the list == null is false) and right then another Thread T2, calls initProviderList() checks that the list is still null, gets false and returns to initialize() , now it starts iterating over the list which is still being written by T1. This case would happen right at the beginning but since I suspected it being ideal for a concurrency exception, I went with another volatile object. If we remove the first (list == null) check before the sync block and have only the one inside it, then every thread has to contend for the sync block even if it is to check whether the list is initialized or not. If the latter case is not a concern then making the list volatile works.