java 单例模式之旅

来源:互联网 发布:ubuntu没有win7启动项 编辑:程序博客网 时间:2024/05/10 14:24

    单例模式在Java中定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。在实际开发中,往往我们有这种需求,有些类,它在系统中只能存在一个实例。比如说在android 开发中,我们会在Application启动中,初始化一些数据,比如登陆名,全局Context,ip地址和端口等等,这时候就可以设计一个单例模式的类来存放这些数据。这里只讨论单例模式的两种写法,饿汉式和懒汉式。

饿汉式:

package com.example.administrator.hideintent;/** * Created by dhl on 2016/12/19. * 饿汉式单例类,在类初始化的时候,已经自行实例化 */public class SingletonClass {    private static final SingletonClass singletonClass = new SingletonClass();    private SingletonClass()    {    }    public static SingletonClass getInstance()    {        return  singletonClass ;    }}
懒汉式:

package com.example.administrator.hideintent;/** * Created by dhl on 2016/12/19. * 单例类,在第一次调用的时候,实例化自己, */public class SingletonClass {    private static  SingletonClass singletonClass = null;    private SingletonClass()    {    }    public static SingletonClass getInstance()    {        if(singletonClass == null)        {            singletonClass = new SingletonClass();        }        return  singletonClass ;    }}

饿汉式因为类创建的时候,就实例化该类,并不存在线程安全问题,但是懒汉式存在线程安全问题。所以要对懒汉式加锁:

package com.example.administrator.hideintent;/** * Created by dhl on 2016/12/19. * 单例类,在第一次调用的时候实例化自己,加锁 */public class SingletonClass {    private static  SingletonClass singletonClass = null;    private SingletonClass()    {    }    public static SingletonClass getInstance()    {        if(singletonClass == null)        {            synchronized (SingletonClass.class)            {                if(singletonClass == null)                {                    singletonClass = new SingletonClass();                }            }        }        return  singletonClass ;    }}

总结:

1,饿汉式是线程安全的,在类创建的时候就创建一个静态的实例供系统使用,以后不再改变。如果该实例在系统中经常使用,饿汉式是个不错的选择。

2,懒汉式, 如果不加锁,则线程不安全。缺点是加锁性能有所损耗,优点是延时加载。如果该实例没有频繁被用到,懒汉式是个不错的选择。



0 0