googlecodelabs / android-build-an-app-architecture-components

Other
266 stars 133 forks source link

Race Condition in SunshineRepository.getInstance #38

Open ronykrell opened 5 years ago

ronykrell commented 5 years ago

There is a race condition in the getInstance method in SunshineRepository.java.

Imagine there are 2 threads - A and B - both calling getInstance() and that sInstance is null to start with

Thread A Checks if sInstance is null. Returns True

Thread B Checks if sInstance is null. Returns True

Thread A Obtains the lock and creates a new instance for sInstance. Releases lock

Thread B Remember Thread B already checked if sInstance was null earlier. Obtains the lock and creates a new instance for sInstance. Releases lock

There should be a second null check inside the synchronized block.