码迷,mamicode.com
首页 > 编程语言 > 详细

单例模式的写法和线程安全性的讨论

时间:2015-04-24 14:23:39      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:单例模式   线程安全   

//饿汉模式:单例模式,就是无论用不用,什么时候用,在类加载的时候就实例化一个这个类的对象
//然后等到使用的时候,就是使用同一个实例对象
//好处:在多线程的环境下使用这种方法,可以避免多线程带来的冲突。与之相对应的是,懒汉模式(按需实例化)
class Singleton1{
	private Singleton1(){}
	private static Singleton1 s1 = new Singleton1();
	public static Singleton1 getSingleton(){
		return s1;
	}
}

//懒汉模式:单例模式,
//好处:直到使用才进行实例对象的初始化,避免内存的浪费
//坏处:会遇到线程安全性问题
class Singleton2{
	private Singleton2(){}
	private static Singleton2 s2 = null;
	public static Singleton2 getSingleton2(){
		if(s2 == null){
			s2 = new Singleton2();
		}
		return s2;
	}
}

//登记式模式:借助内部类,属于懒汉式单例,因为Java机制规定,
//内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了lazy),
//而且其加载过程是线程安全的,所以这种模式克服了懒汉和饿汉模式的缺点

class Singleton3{
	private Singleton3(){}
	private static class SingleHolder{
		private final static Singleton3 s3 = new Singleton3();
	}
	
	public static Singleton3 getSingleton3(){
		return SingleHolder.s3;
	}
}

//普通加锁解决单例模式的线程安全问题
//分析:虽然解决了线程安全问题,但是每个线程调用getInstance都要加锁,
//我们想要只在第一次调用getInstance时加锁,就需要进行改进

class Singleton4{
	private static Singleton4 s4= null;
	private Singleton4(){}
	public static synchronized Singleton4 getSingleton4(){
		if(s4 == null){
			s4 = new Singleton4();
		}
		return s4;
	}
}

单例模式的写法和线程安全性的讨论

标签:单例模式   线程安全   

原文地址:http://blog.csdn.net/simongeek/article/details/45245061

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!