单例模式在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,懒汉式, 如果不加锁,则线程不安全。缺点是加锁性能有所损耗,优点是延时加载。如果该实例没有频繁被用到,懒汉式是个不错的选择。