java设计模式之单例模式

       万事开头难,我庆幸的是我迈出了第一步,这是我的第一篇个人博客,其实我更多的是想把这个当做个人学习成长过程中的一点纪录,如写的不好还请指出,如能帮到一些需要的朋友更好.本人水平有限...如有看客,轻拍...谢谢


       我相信每位朋友在面试中都或多或少的被面试官问到关于常用的设计模式谈谈自己的理解,大部分人都能随口说出有,单例模式,策略模式,模板方法等等,但能真正理解并运用到实际项目中的又有多少?再次声明我自己也很水,所以我选择了最简单的单例模式把自己的理解记录下来,以下内容有参考网上的其他网友的文章。如有侵权,请指出.


进入正题,单例模式我所知道的有三种,分为饿汉式跟懒汉式,(至于为什么取名叫饿汉式,懒汉式,我也不清楚),还有双重锁的写法(double-lock)该写法主要是考虑到多线程以及性能的优化。


第一种: 饿汉式

public class MySingle {

	private static final MySingle mSingle = new MySingle();

	private MySingle() {
	}

	public static MySingle getInstance() {
		return mSingle;
	}

}


第二种:懒汉式

public class MySingle {

	private static MySingle mSingle = null;

	private MySingle() {
	}

	public static synchronized MySingle getInstance() {
		if (mSingle == null) {
			mSingle = new MySingle();
		}
		return mSingle;
	}

}


第三种:双重锁

public class MySingle {

	private static MySingle mSingle = null;

	private MySingle() {
	}

	public static MySingle getInstance() {
		if (mSingle == null) {
			synchronized (MySingle.class) {
				if (mSingle == null) {
					mSingle = new MySingle();
				}
			}
		}
		return mSingle;
	}
}

这里对于新手来说,比较不好理解的可能就是第三种,我把自己的理解稍微描述下,你可以想象下,多条线程同时调用getInstance方法,刚好就有那么巧(多线程的不确定性)有两条线程都通过第一个判空条件,其中有一条线程A获取到锁,另外一个线程B在等待,A通过了第二个判空条件,new了个实例,然后释放锁,此时线程B获取到锁,进入到第二个判空条件,不满足,直接return mSingle,而不会重新new一个实例。确保了多线程访问的安全性。


最后说说这三种写法的区别:饿汉式简单明了,是线程安全的,在类创建的同时就创建好了一个静态的final对象供使用;懒汉式是需要的时候,才创建对象,也就是说延时加载。注意考虑到多线程时得对方法加锁,对比饿汉式在类创建的同时就创建实例,我没有对比在实际项目中会有多大影响; 至于双重锁这种写法能提高多少性能,我也没有实际测试,还请知道的朋友多多指点.


最后,写完第一篇博客的一点感受,以前都看大神写的博客多,今儿自己写才发现真心不容易..费神..不过也乐在其中...最后最后,还是那句,本人水平有限,如有看客,发现有错,请不吝指出,谢谢...可能我想太多,或许根本不会有人注意到,哈哈哈哈哈哈....




你可能感兴趣的:(java,单例模式,java设计模式)