I think _synchronized_ is appropriate here, as you want to prevent two threads from doing the same expensive work: it's better to block one rather than allowing "parallelism" of useless operations.

What you could do to improve is to check the 

    IndexManager indexManager = indexManagersRegistry.get( providerName ); 

method also in the caller first: being optimistic is reasonable as it's going to be far more common to hit an existing IM than having to create one, and in such case different threads won't hit the synchronization at all.

(indexManagersRegistry is a concurrentMap so no synch is needed for reads)