美文网首页
单例模式

单例模式

作者: Charein | 来源:发表于2018-03-26 20:27 被阅读0次

    确保类只有一个实例,并且提供一个全局访问点。

    下面看一个最简单的单例代码:

    public class Single {
        private static Single INSTANCE;
    
        private Single() {
        }
    
        public static Single getInstance() {
            if (INSTANCE == null) {
                INSTANCE = new Single();
            }
    
            return INSTANCE;
        }
    }
    

    上面的代码在多线程下会出现问题,如果要考虑多线程,可以使用sychronized同步方法,如:

    public class Single {
        private static Single INSTANCE;
    
        private Single() {
        }
    
        public synchronized static Single getInstance() {
            if (INSTANCE == null) {
                INSTANCE = new Single();
            }
    
            return INSTANCE;
        }
    }
    

    如果仔细分析,可知每次调用getInstance()方法都会被阻塞(不论INSTANCE是否已经实例化,其实被实例化之后不需要再进行同步),这时可采用同步代码块的方式,如:

    public class Single {
        private static Single INSTANCE;
    
        private Single() {
        }
    
        public static Single getInstance() {
            if (INSTANCE == null) {
                synchronized (Single.class) {
                    if (INSTANCE == null) {
                        INSTANCE = new Single();
                    }
                }
            }
    
            return INSTANCE;
        }
    }
    

    上述的方式都是通过延时实例化,如果不考虑提前创建的负担,可以使用这种方式(它保证了线程安全)

    public class Single {
        private static Single INSTANCE = new Single();
    
        private Single() {
        }
    
        public static Single getInstance() {
            return INSTANCE;
        }
    }
    

    相关文章

      网友评论

          本文标题:单例模式

          本文链接:https://www.haomeiwen.com/subject/yaqdcftx.html