This is probably an old topic, but I still find others including myself making these mistakes, so I thought I would write about it.

Everyone should know what a singleton is, usually used when you need one instantiation of an object across the system.

The incorrect way

public class BadSingleton
{
	private static BadSingleton _instance;
	
	public static BadSingleton getInstance()
	{
		if(_instance==null)
		{
			_instance = new BadSingleton();
		}
		
		return _instance;
	}
	
	private BadSingleton()
	{
		//do initializations here
	}
}

The double checked locking way

This came about as an optimization for early JVMs, in the modern world – this is a bad practice.

public class VeryBadSingleton
{
	private static VeryBadSingleton _instance;
	
	public static VeryBadSingleton getInstance()
	{
		if(_instance==null)
		{
			synchronized(VeryBadSingleton.class)
			{
				if(_instance==null)
				{
					_instance = new VeryBadSingleton();
				}
			}
		}
		
		return _instance;
	}
	
	private VeryBadSingleton()
	{
		//do initializations here
	}
}

The correct way

public class CorrectSingleton
{
	private static CorrectSingleton _instance;
	
	public synchronized static CorrectSingleton getInstance()
	{
		if(_instance==null)
		{
			_instance = new CorrectSingleton();
		}
		
		return _instance;
	}
	
	private CorrectSingleton()
	{
		//do initializations here
	}
}