单例模式中的饿汉模式
先看代码:
package com.roocon.thread.t5; public class Singleton { private Singleton(){ } private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } }
package com.roocon.thread.t5; public class Main { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); Singleton s3 = Singleton.getInstance(); Singleton s4 = Singleton.getInstance(); System.out.println(s1); System.out.println(s1); System.out.println(s1); System.out.println(s1); } }
运行结果:
com.roocon.thread.t5.Singleton@5cad8086
com.roocon.thread.t5.Singleton@5cad8086
com.roocon.thread.t5.Singleton@5cad8086
com.roocon.thread.t5.Singleton@5cad8086
所谓的饿汉模式:不管是否使用到instance这个实例,我们都在创建的过程中就对它进行实例化。
那么,饿汉模式是否会出现线程安全问题呢?
出现线程安全问题需要满足三个条件:
1.多线程的环境下
2.必须有共享资源
3.对资源进行非原子性操作
根据以上代码,我们发现,使用饿汉式,在调动getInstance方法时,就只干了一件事,那就是返回Instance实例。这个操作是原子性操作。因此,饿汉式不存在线程安全问题。
饿汉式的不足:不管是否需要使用到该实例,在创建的时候就已经实例化了。但其实在程序中根本没有用到该实例变量,就没必要先对它进行实例化。
推荐是在使用它的时候才对它进行实例化,这就是所谓的懒汉式单例模式。
作者:凌晨六点半
出处:http://www.cnblogs.com/sunnyDream/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击右下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!