There are four ways to implement Singleton pattern in Java
1) Singleton by synchronizing getInstance() method
2) Singleton with public static final field initialized during class loading.
3) Singleton generated by static nested class, also referred as Singleton holder pattern.
4) From Java 5 on-wards using Enums
Coming to your second query, I would suggest to go through the article present in Java site which discusses various scenarios when a Singleton is not really remains Singleton and multiple instance of Singleton is possible.