I read this paper on double-checked locking. It had a great discussion of the pitfalls of using this approach for implementing the Singleton Pattern. Here is a typical example of an unsafe implementation:
public static Singleton getInstance()
{
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}