美文网首页
单列在C#和javaScript中的的用法

单列在C#和javaScript中的的用法

作者: 莫晓白 | 来源:发表于2017-06-11 16:09 被阅读0次

    单列

    保证客户程序不会通过new()操作产生一个实例

    C#
    经典的单列写法

    public class Singleton {
    
      private static Singleton instance;
    
        private Singleton(){}
    
        public static Singleton GetInstance(){
    
            if (instance == null) {
    
                instance = new Singleton ();
    
            }
    
            return instance;
        }
    }
    

    这里面不得不说,多线程这个货,简直丧良心了,为啥呢——
    在这种经典模式下,没有考虑线程并发获取实例问题,即可能出现两个线程同时获取instance实例,且此时其为null时,就会出现两个线程分别创建了instance,违反了单例规则。

    改进型

    public class Singleton  {  
    
        private static Singleton instance;  
    
        private static object _lock = new object();  
    
        private Singleton()  {  }  
    
        public static Singleton GetInstance()  {  
    
            if(instance==null)  {  
    
                lock(_lock)  {  
    
                    if(instance==null)  {  
    
                        instance=new Singleton();  
                    }  
                }  
            }  
            return instance;  
        }  
    } 
    

    假如线程A和线程B同时执行上段代码,A执行要快0.1s,那么会优先执行lock。判断是_lock是否申请的了互斥锁,没有申请的情况下,再判断有没有实例化。
    线程B在0.1s后执行的时候,发现已近 _lock已经申请了互斥锁,只能等待A执行完成,A在执行的时候已经完成了实例化,那么B只要返回就可以。这样就不会出现分别实例化的现象了。

    javaScript

    js有一点尴尬,就是他没有类的概念(这里下面的代码用的是非ES6),我们姑且把一个function当成一个类来看

    我们写一个简单的,点击一个按钮生成一个弹框

    //html
     <button id="popup">btn</button>
    
    //js
     var createPopups = (function () {
            var div;
            return function () {
                if (!div) {
                    div = document.createElement('div');
                    div.innerHTML = '生成弹窗';
                    div.style.display = 'none';
                    document.body.appendChild(div);
                }
                return div;
            }
        })();
    
        document.getElementById('popup').onclick = function () {
            var popupInstance = createPopups();
            popupInstance.style.display = 'block';
        }
    

    其实我们也可以做一个隐藏的,主要看需求了,还有个人喜好。。。

    相关文章

      网友评论

          本文标题:单列在C#和javaScript中的的用法

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