Java的单例

Java中经常要用到单例了,其实单例有几种变体版本,其中有一些细微的差别。

最常见的是这种了,如果没有并发的要求,可以将getInstance()前的synchronized去掉,否则影响性能

public class Singleton {
	private static Singleton instance;
	private Singleton(){
		//构造方法必须是私有的
	};
	
	public static synchronized Singleton getInstance(){
		if(instance==null){
			return new Singleton();//如果没有同步锁,则有可能有两个线程同时进入这行代码,造成第二个实例的出现
		}else{
			return instance;
		}
	};
}

这种带同步的方式有一个问题,即——事实上只有第一执行该方法时,才真正需要同步,但这么处理每次方法调用都会用同步锁,在带来了性能下降,解决这个问题可以将实例化提前进行

public class Singleton {
	private static Singleton instance=new Singleton();
	private Singleton(){
		
	}
	public static Singleton getInstance(){
			return instance;
	}
}
这么着确实能保证了类加载的时候实例就创建好了,但如果实例化是开销比较大的操作的化,这样就会在不需要调用方法时也浪费了系统资源。

下面的方法只在实例未创建时用同步创建实例

public class Singleton {
	private volatile static Singleton instance;
	private Singleton(){
		
	}
	public static Singleton getInstance(){
		if(instance==null){
			synchronized (Singleton.class) {
				if(instance==null){
					instance=new Singleton();
				}
			}
		}
		return instance;
	}
}


关于volatile关键字可以参考下面的博文:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值