单例模式概念:单例模式是指唯一实例的意思,也就是说一个类只能有唯一一个实例。在Java中智能new一个类。
两种单例模式示意:
1. 饿汉式单例模式
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton (){
//..
}
public static Singleton getInstance(){
return instance;
}
}
注:单例模式中,要将构造函数定义为私有,以防止构造函数获取该类的实例。
2. 懒汉式单例模式(另外一种展现方式)
public class Singleton{
private static Singleton instance=null;
private Singleton (){
//..
}
public static Singleton getInstance(){
if(instance ==null){
instance=new Singleton();
}
return instance;
}
}
饿汉式和懒汉式单例模式的区别在于创建实例的时机,饿汉式单例模式在该类加载时就被创建,懒汉式单例模式在需要获取的时候进行创建。
懒汉式的单例模式在单线程中不会出现问题,但是在多线程中,当每个线程都要进行if(instance==null)判断时,就会出现多个实例,违背了单例模式的原则,所以要在getInstance()前加上synchronized(同步)机制。
当synchronized用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
具体代码如下:
public class Singleton{
private static Singleton instance=null;
private Singleton (){
//..
}
public static synchronized ingleton getInstance(){
if(instance ==null){
instance=new Singleton();
}
return instance;
}
}
这种方式将导致每获取一次实例,都将进入同步机制,如果需要大量获取该实例时,这种方式则显得低效,所以改为将synchronized 放在产生实例的代码前,如下:
public class Singleton{
private static Singleton instance=null;
private Singleton (){
//..
}
public static ingleton getInstance(){
if(instance ==null){
synchronized(Singleton.class){//增加同步机制
instance=new Singleton();
}
}
return instance;
}
}
以上方式可以避免每次获取实例,都进入同步机制,但是该方法避免不了多线程时,返回多个实例的问题,所以要进行双检测锁机制。
3. 双检测锁机制
public class Singleton{
private static Singleton instance=null;
private Singleton (){
//..
}
public static ingleton getInstance(){
if(instance ==null){
synchronized(Singleton.class){//增加同步机制
if(instance ==null){//再进行null判断
instance=new Singleton();
}
}
}
return instance;
}
}
这种方式将会第一次创建实例进入同步机制,以后将不会进入,且满足多线程的需求。但是相比较而言,单例模式中还是饿汉式单例模式简单,直接开始就进行new一个实例。