Is this a good implementation of a thread-safe singleton using the observer pattern?
The notifyListeners() method is private, and is never called anywhere. It should be synchronized on the same lock than the other methods using the list of listeners.

Unless lazy instantiation is really needed, I wouldn't use it. Just use the following code:

private static final ObserverSingleton INSTANCE = new ObserverSingleton();

public static ObserverSingleton getInstance() {
    return INSTANCE;
}


Also, I would use a Set&lt;OnRequestFinishedListener&gt; rather than a list, since your add method makes sure there is only one copy of a listener inside the list, and Set is precisely used for that. If order of insertion matters, use a LinkedHashSet&lt;OnRequestFinishedListener&gt;. 

Declaring the List as ArrayList is bad practice. You should declare it as List, since the concrete type doesn't matter.