单例模式的几种设计方法

package test1;
//饿汉模式
/*public class SingleDemo {
	private static SingleDemo instance = new SingleDemo();
	private SingleDemo(){}
	public static SingleDemo getinstance(){
		return instance;
	}
}*/

//懒汉模式
/*public class SingleDemo{
	private static SingleDemo instance=null;
	private SingleDemo(){}
	public static SingleDemo getinstance(){
		if(instance==null)
			instance = new SingleDemo();
		return instance;
	}
}*/

//懒汉加锁-线程安全
/*public class SingleDemo{
	private static SingleDemo instance=null;
	private SingleDemo(){}
	public static synchronized SingleDemo getinstance(){
		if(instance==null)
			instance=new SingleDemo();
		return instance;
	}
}*/
//双重校验+锁机制
/*加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,
依然不够完美。synchronized修饰的同步方法比一般方法要慢很多,如果多次调用getInstance(),
累积的性能损耗就比较大了。因此就有了双重校验锁,先看下它的实现代码。*/
/*public class SingleDemo{
	private static SingleDemo instance=null;
	private SingleDemo(){}
	public static SingleDemo getinstance(){
		if(instance==null)
			synchronized(SingleDemo.class){//这个括号必须加
				if(instance==null)
					instance=new SingleDemo();
			}
		return instance;	
	}
}*/
/*由于指令重排优化的存在,导致初始化Singleton和将对象地址赋给instance字段的顺序是不确定的。
在某个线程创建单例对象时,在构造方法被调用之前,就为该对象分配了内存空间并将对象的字段设置为默认值。
此时就可以将分配的内存地址赋值给instance字段了,然而该对象可能还没有初始化。
若紧接着另外一个线程来调用getInstance,取到的就是状态不正确的对象,程序就会出错。
*/
//使用 volatile 关键字保证读之前,对象被初始化
/*public class SingleDemo{
	private static volatile SingleDemo instance=null;
	private SingleDemo(){}
	public static SingleDemo getinstance(){
		if(instance==null)
			synchronized(SingleDemo.class){//这个括号必须加
				if(instance==null)
					instance=new SingleDemo();
			}
		return instance;	
	}
}*/
//静态内部类
public class SingleDemo{
	private static class SingleHolder{
		public static SingleDemo instance = new SingleDemo();
	}
	private SingleDemo(){}
	public static SingleDemo getinstance(){
		return SingleHolder.instance;
	}
}

阅读更多
上一篇简单的死锁
下一篇字符串按8位截取输出
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭