java 单例模式之旅

    单例模式在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值