【单例模式】

【单例模式】,第1张

【单例模式

public class FaceObject implements Serializable {//让单例类可以被序列化

    public static void main(String[] args) {

        Singleton s = Singleton.getInstance();
        s.method();
        Singleton s2 = Singleton.getInstance();
        s2.method();
        System.out.println(s == s2);
        int i =Math.max(0,127);
        System.out.println(i);
    }


    //饿汉模式单例
    static class Singleton {
       private Singleton(){}//构造方法私有化
        private static Singleton s =new Singleton();//创建本类对象
        private static Singleton getInstance(){//提供一个获取本类对象的方法(私有并且静态)
            return s;
        }
        public void method(){
            System.out.println("饿汉单例模式运行");
        }
    }

    //懒汉模式单例
    static class Singleton2 {
        private Singleton2() {
            if(s2!=null){//防止反射调用私有构造方法
                throw new RuntimeException("此类对象为单例模式,已经被实例化了");
            }
        }
        private volatile static Singleton2 s2=null;//加上volatile关键字保证变量的一致性

        private static Singleton2 getInstance() {
            //双重判断解决多线程问题
            if (s2 == null) {//第一次判断是判断是否已经创建了对象
                synchronized (Singleton2.class) {//加锁,解决线程安全的问题
                    if (s2 == null) {//是抢到第一次cpu时间片的线程用来判断是否已经创建对象
                        s2 = new Singleton2();
                    }
                }
            }
            return s2;
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5721661.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存