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

来源:互联网 发布:出售淘宝花呗店铺 编辑:程序博客网 时间:2024/05/21 10:35

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(){    }}
0 0
原创粉丝点击