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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值