单例模式可以保证只有一个实体类,并且在全局都可以进行使用。
在多线程中使用单例模式,
懒汉模式:线程安全
public class Singleton{
private static uniqueInstance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance=new Singleton();
}
return uniqueInstance;
}
}
在使用synchronized
关键字之后,每次只有一个线程可以进入到该方法中,但是使用synchronized
关键字会造成开销过大
在这种状态下,只有第一次进行初始化的时候与synchronized
关键字有关,即意见实例化该类,就无需使用synchronized
了
Eagerly created instance
当程序总是需要创建或者当单例容易提前创建时,可以采用下面的方式。
public class Singleton{
private static Singleton uniqueInstance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}
通过这种方式来创建单例模式,依赖于JVM加载Classs时创建单例,JVM可以使得该单例在任何线程调用之前,就已经被创建。
通过“双重锁检测”的方式来创建单例,不需要使用synchronized
通过双重锁检测,首先需要检测该单例是否已经被创建,如果没有被创建,则使用synchronized
,通过这种方式只有在第一次调用的时候使用synchronized
public class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance==null){
synchronized(Singleton.class){
if(uniqueInstance==null){
uniqueInstance=new Singleton();
}
}
}
}
}
当这一个Class实例被创建时,volatile
关键字可以保证多线程正确地操作这一个单例变量