package singleton;
//经典实现方式,但是在多线程环境下就会出问题,
//可能连个线程同时进入了uniqueInstance==null那条控制路径
public class Singleton {
	private static Singleton uniqueInstance;
	private Singleton() {
	} //
	public static Singleton getInstance() {
		if (uniqueInstance == null) { // 延迟实例化,懒汉式
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}//对方法加锁,同步线程对其的调用
//但是只有第一次执行getInstance时,才真正需要同步,其他时候都是对性能的损耗
public class Singleton2 {
	private static Singleton2 uniqueInstance;
	private Singleton2() {
	}
	// 每次都需要同步
	public static synchronized Singleton2 getInstance() {
		if (uniqueInstance == null) {
			uniqueInstance = new Singleton2();
		}
		return uniqueInstance;
	}
}//使用“急切”创建实例(饿汉式),JVM会在线程访问这个静态变量之前,一定先创建这个实例,所以线程安全。
//缺点是不是在需要的时候才创建实例
public class Singleton3 {
	private static  Singleton3 uniqueInstance = new Singleton3();
	private Singleton3() {
	}
	// 直接使用
	public static  Singleton3 getInstance() {
		return uniqueInstance;
	}
}//利用双重检查加锁,在getInstance方法中减少使用同步,只有第一次会同步
public class Singleton4 {
	private static volatile Singleton4 uniqueInstance;
	private Singleton4() {
	}
	// 缩小同步范围
	public static synchronized Singleton4 getInstance() {
		if (uniqueInstance == null) {//pointA
			synchronized(Singleton4.class){
				if(uniqueInstance == null)//pointB
					uniqueInstance = new Singleton4();
			}
		}
		return uniqueInstance;
	}
}public class Runtime {
    private static Runtime currentRuntime = new Runtime();
    public static Runtime getRuntime() {
        return currentRuntime;
    }
    /** Don't let anyone else instantiate this class */
    private Runtime() {}
    ..............
}
public class Desktop {
    private DesktopPeer peer;
    /**
     * Suppresses default constructor for noninstantiability.
     */
    private Desktop() {
        peer = Toolkit.getDefaultToolkit().createDesktopPeer(this);
    }
    public static synchronized Desktop getDesktop(){
        if (GraphicsEnvironment.isHeadless()) throw new HeadlessException();
        if (!Desktop.isDesktopSupported()) {
            throw new UnsupportedOperationException("Desktop API is not " +
                                                    "supported on the current platform");
        }
        sun.awt.AppContext context = sun.awt.AppContext.getAppContext();
        Desktop desktop = (Desktop)context.get(Desktop.class);
        if (desktop == null) {
            desktop = new Desktop();
            context.put(Desktop.class, desktop);
        }
        return desktop;
    }原文:http://blog.csdn.net/vonzhoufz/article/details/44348201