单例

                                            两种单例


   Java中有两种实现单例的模式,一种是饿汉式,一种是懒汉式。饿汉式是从一开始就创建单例对象,懒汉式是什么时候需要这个单例对象就去找这个单例对象,当发现没有时再创建。

1.饿汉式
饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,
Singleton的唯一实例只能通过getInstance()方法访问。(
事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。
此问题在此处不做讨论,姑且闭着眼就认为反射机制不存在。)

public class Ehan {

private static int in = 1;
private static Ehan ehan = new Ehan();

//私有的构造方法避免了new 出本对象,只能通过getInstance方法获得本对象
private Ehan(){
	
}
public static Ehan getInstance(){
	int in = 2;
	
	return ehan;
}
public static int getIn() {
	return in;
}
public static void setIn(int in) {
	Ehan.in = in;
}

}

2.懒汉式

  • 该示例虽然用延迟加载方式实现了懒汉式单例,但在多线程环境下会产生多个single对象,如何改造请看以下方式: 使用synchronized同步锁

public class Lanhan {

private Lanhan() {

}

private static Lanhan lanhan = new Lanhan();

public Lanhan getInstance() {

	if (lanhan == null) {
		synchronized (Lanhan.class) {
			if (lanhan == null) {
				lanhan = new Lanhan();
			}
		}
	}
	return lanhan;

}

}

最后:
类的构造器为私有(private)的话是不能被继承的。

你可能感兴趣的:(Java)