您的位置:首页 > 其它

解决多线程单例模式的线程不安全问题

2017-05-02 17:00 465 查看

DCL双检查锁机制

public class MyConfig {
private volatile static MyConfig myConfig = null;//volatile 保证每个线程都是从主存中读取最新的数据

private MyConfig(){

}
public static MyConfig getInstance(){
if(null != myConfig){

}else {
//同步代码块
synchronized (MyConfig.class){
if(null == myConfig){
myConfig = new MyConfig();
}
}
}
return myConfig;
}
}


静态内置类

public class MyConfig {

private MyConfig(){}

private static class MyConfigHandler{
private static MyConfig myConfig = new MyConfig();
}

public static MyConfig getInstance(){
return MyConfigHandler.myConfig;
}
}


序列化和反序列化

public class MyConfig implements Serializable{
private volatile static MyConfig myConfig = null;//volatile 保证每个线程都是从主存中读取最新的数据

private MyConfig(){

}
public static MyConfig getInstance(){
if(null != myConfig){

}else {
//同步代码块
synchronized (MyConfig.class){
if(null == myConfig){
myConfig = new MyConfig();
}
}
}
return myConfig;
}

//单例类需实现这个方法,readResolve方法应对单例对象被序列化时候
public Object readResolve(){
return getInstance();
}

public static MyConfig getMyConfig(){

try {
MyConfig myConfig = MyConfig.getInstance();
FileOutputStream fileOutputStream = new FileOutputStream(new File("myobject.txt"));
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(myConfig);
objectOutputStream.close();
fileOutputStream.close();
System.out.println(myConfig.hashCode());
}catch (Exception e){
e.printStackTrace();
}
MyConfig myConfig = null;
try {
FileInputStream fileInputStream = new FileInputStream(new File("myobject.txt"));
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
myConfig = (MyConfig) objectInputStream.readObject();
objectInputStream.close();
fileInputStream.close();
System.out.println(myConfig.hashCode());
}catch (Exception e){
e.printStackTrace();
}
return myConfig;
}
}


静态代码块

public class MyConfig{
private static MyConfig myConfig = null;

private MyConfig(){}

static{
myConfig = new MyConfig();
}

public static MyConfig getInstance(){
return myConfig;
}
}


枚举实现

public class MyConfig {

public enum MyConfigEnum{
connectionFactofry;
private MyConnection myConnection = null;
private MyConfigEnum(){
myConnection = new MyConnection();
}
public MyConnection getMyConnection(){
return myConnection;
}
}
public static MyConnection getConnection(){
return MyConfigEnum.connectionFactofry.getMyConnection();
}
}

public class MyConnection {
public MyConnection(){

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 单例模式
相关文章推荐