单例模式:创建全局的唯一一个实例!
1、普通单例
public class Singleton{
private Singleton single = null;
private Singleton(){
}
public Singleton getSingleton(){
if(null ==single ){
single = new Singleton();
}
return single;
}
} 此方法,及其不安全
2、饿汉式
public class Singleton{
private static Singleton single = new Singleton();
private Singleton(){
}
public Singleton getSingleton(){
return single;
}
} 此方式在类加载的时候就创建了单例对象,由于类在加载的时候对其方法是没有什么影响和调用的,所以,设置一个公共方法直接返回实例!此方法是线程安全的,因为此类加载之后实例对象只初始化一次,并且有static修饰,也不会被GC回收,不管多少个线程调用,都只是一个实例!
3、懒汉式
public class Singleton{
private static Singleton single = null;
private Singleton(){
}
public static Singleton getSingleton(){
if(null ==single ){
single = new Singleton();
}
return single;
}
}懒汉式只是在类加载的时候创建了一个引用,但是并没有创建对象,只有在用到getSingleton方法的时候才会去判断为null的时候去创建对象,在多线程情况下此方法也是不安全的,有可能会创建多个对象的情况!所以我们对懒汉式进行改进 同步锁的懒汉式
public class Singleton{
private static Singleton single = null;
private Singleton(){
}
public static synchornized Singleton getSingleton(){
if(null ==single ){
single = new Singleton();
}
return single;
}
}我们在方法上加上了同步锁,此时单例是安全的,但是效率会下降,当一个线程进来的时候其他的线程就只能在外面等待,并不能做其他的事情,这就是阻塞是工作方式,于是我们就又对其进行改进,让他们先判断再进来
public class Singleton{
private static Singleton single = null;
private Singleton(){
}
public static Singleton getSingleton(){
if(null ==single ){
synchornized (this){
single = new Singleton();
}
}
return single;
}
}这个方法我们优化了那些不是null的对象判断,不是null的时候直接返回对象,不在浪费时间进同步锁里面了!但是这就会又出现问题,我们的同步块儿里面的就又会出现问题,当两个线程同时判断是null的时候,这时候就可能创建两个对象了!所以我们就又对其改进,在同步块儿里面再进行一次判断
public class Singleton{
private static Singleton single = null;
private Singleton(){
}
public static Singleton getSingleton(){
if(null ==single ){
synchornized (this){
if(null ==single ){
single = new Singleton();
}
}
}
return single;
}
}我们对这个单例进行double check,双检查,这样就会保证总会一个线程初始化了就不会在初始化对象了!但是这是对的吗?不对的,虚拟机在创建对象的时候会进行重排序,进而是性能更加优异!所以 single = new Singleton();这个句子会发生重排序,我们要用violate去修饰Singleton,具体的violate可以去看看我的violate关键字的意思!所以就变成了这样
public class Singleton{
private violate static Singleton single = null;
private Singleton(){
}
public static Singleton getSingleton(){
if(null ==single ){
synchornized (this){
if(null ==single ){
single = new Singleton();
}
}
}
return single;
}
}
(待续)