9、单例模式优化
1、使用同步保正线程安全 synchronized
2、使用volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或
读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译
器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,
将出现不一致的现象。
3、防止反射调用私有构造方法
4、让单例类序例化安全
package com.vince.singleton;
import com.sun.org.apache.xalan.internal.xsltc.dom.SingletonIterator;
//单例模式
public class Singleton{
private static Singleton singleton=null;
private Singleton(){ }
public static Singleton getInstance(){
if(singleton ==null){
singleton=new Singleton();
}
return singleton;
}
}
程序的优化
package com.vince.singleton;
import com.sun.org.apache.xalan.internal.xsltc.dom.SingletonIterator;
import java.io.Serializable;
//单例模式
//优化程序
/*
1、多线程访问的安全问题
2、加上volatile关键字保证变量的一致性
3、防止反射调用私有构造方法
4、让单例类序例化安全
*/
//不一定是最perfect,对象的克隆
public class Singleton implements Serializable {
//加上volatile关键字保证变量的一致性
private volatile static Singleton singleton=null;
private Singleton(){
//3、防止反射调用私有构造方法
if(singleton!=null){
throw new RuntimeException("此类已经为单例模式,已经被实例化了");
}
}
public static Singleton getInstance(){
if(singleton==null) {
//Synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
//1、解决线程安全
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}