Используется в качестве отложенной инициализации (например, создание экземпляра синглтона возможно только при необходимости).Проблема с этим кодом в том, что он сломан.Очевидно, что даже при использовании блока синхронизации существует вероятность того, что что-то пойдет не так (из-за условий гонки).Поэтому не используйте этот метод, если вы хотите быть в безопасности!
Альтернативы: Использование прямого присваивания (как вы sugessted);
private static volatile DataProvider sInstance = new DataProvider();
Или использование enum (как предложено @MadProgrammer);
public enum DataProvider
{
INSTANCE;
// singleton content
}