单例模式: 是一个比较简单的模式(类只有一个实例,而且自己实例化并向整个系统提供这个实例)
单利模式统一代码:(通过使用private构造函数确保在一个英语中只产生一个实例,并且是自己实例化的),代码如下:
public class Singleton{
private static final Singleton singleton=new Singleton();
//限制产生多个对象
private Singleton(){}
//通过这个方法获得实例对象
public static Singleton getSingleton(){
return singleton;
}
//类里面的其他方法,尽量使static
public static void doSomething(){
}
}
单例模式的使用场景:
1》要求生成唯一的序列号的环境;
2》在整个项目里面需要一个共享访问点或共享数据;
3》创建一个对象需要消耗的资源过多,如果要访问IO和数据等资源;
4》需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单利模式(当然,也可以直接声明为static的方式);
单例模式的注意事项:
单例模式有很多种实现方法,开始给出的通用代码不会出现线程同步问题,但是下面的方法就需要考虑线程同步问题:
public class Singleton{
private static Singleton singleton=null;
//限制生成多个对象
private Singleton(){
}
//通过该方法获得实例对象
public static Singleton getSingleton(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
这个模式在低并发的情况下不会出现问题,但是并发量增多的时候边可能会在内存里面出现多个实例,破坏我们的预想,,,这个时候我们便需要在getSingleton()方法前面加synchronized关键字;
public class Singleton{
private static Singleton singleton=null;
//限制生成多个对象
private Singleton(){
}
//通过该方法获得实例对象
//利用synchronized 关键字来实现线程安全,也就是锁定这个方法,在这个方法在运行
//的时候,不允许被其他调用,直到当前对象调用完成,其他调用才会继续运行
public static Singleton synchronized getSingleton(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}