patternjavaMajor
Is my code a 'safe' singleton?
Viewed 0 times
codesingletonsafe
Problem
I was wondering if my code will produce a true singleton. I am creating an Android app, and all activities should access my API through one instance of the
Use of the class would look like:
SyncApi class.public class Api {
private static SyncApi api = null;
static {
synchronized (api) {
if (api == null) {
api = new ApiFActory().getSyncApi();
}
}
}
public static SyncApi getInstance() {
return api;
}
}Use of the class would look like:
SyncApi api = Api.getInstance();
api.logOn("jjnguy", "pa55w0rd");Solution
In Java there’s an established idiom for creating a thread-safe singleton, due to Bill Pugh:
This implementation is both lazy and completely thread-safe, without the need to explicit synchronization and checking. This has the advantage that it eliminates the possibility of subtle race conditions and redundant locking.
public class Api {
private Api() { }
private static class SingletonHolder {
public static final SyncApi INSTANCE = new ApiFactory().getSyncApi();
}
public static SyncApi getInstance() {
return SingletonHolder.INSTANCE;
}
}This implementation is both lazy and completely thread-safe, without the need to explicit synchronization and checking. This has the advantage that it eliminates the possibility of subtle race conditions and redundant locking.
Code Snippets
public class Api {
private Api() { }
private static class SingletonHolder {
public static final SyncApi INSTANCE = new ApiFactory().getSyncApi();
}
public static SyncApi getInstance() {
return SingletonHolder.INSTANCE;
}
}Context
StackExchange Code Review Q#1673, answer score: 42
Revisions (0)
No revisions yet.