zoukankan      html  css  js  c++  java
  • Synchronized vs SyncRoot

    我们知道,在.net的一些集合类型中,譬如Hashtable和ArrayList,都有Synchronized静态方法和SyncRoot实例方法,他们之间有联系吗?我怎么才能用好他们呢?
    我们以Hashtable为例,看看他们的基本用法:

                Hashtable ht = Hashtable.Synchronized(new Hashtable());
                
    lock (ht.SyncRoot)
                
    {
                    
    //一些操作
                }
    1,Synchronized表示返回一个线程安全的Hashtable,什么样的hashtable才是一个线程安全的呢?下边我们就从.NET的源码开始理解。
    public static Hashtable Synchronized(Hashtable table)
    {
        
    if (table == null)
        
    {
            
    throw new ArgumentNullException("table");
        }

        
    return new SyncHashtable(table);
    }

    从源码不难看出,Synchronized方法返回的其实是一个SynchHashtable类型的实例。在前边我们说过,Synchronized表示返回一个线程安全的Hashtable,从这个解释不难看出,SynchHashtable应该是继承自Hashtable。下边我们验证一下。看看SynchHashtable类型的源码:
    Code
    呵呵,果然不出我们所料,SyncHashtable果然继承自Hashtable,SyncHashtable之所有能实现线程的安全操作,就是因为在他们的一些方法中,就加了lock,我们知道,哪一个线程执行了lock操作,在他还没有释放lock之前,其他线程都要处于堵塞状态。SyncHashtable就是通过这种方法,来实现所谓的线程安全。

    现在我们理解了Synchronized的含义和用法,那接下来我们看看他和SyncRoot之间的关系。
    SyncRoot表示获取可用于同步 Hashtable 访问的对象,老实说,这个解释不好理解,要想真正理解他的用法,我们还得从源码开始:
    public virtual object SyncRoot
    {
        
    get
        
    {
            
    if (this._syncRoot == null)
            
    {
                Interlocked.CompareExchange(
    ref this._syncRoot, new object(), null);
            }

            
    return this._syncRoot;
        }

    }

     

     
    如果您清楚Interlocked的用法,这段代码没什么难理解的了(不清楚的朋友找GOOGLE吧),Interlocked为多个线程共享的变量提供原子操作。 原子操作就是单线程操作。在一个Hashtable实例中,不论我们在代码的任何位置调用,返回的都是同一个object类型的对象。我们在开始写的lock(ht.SyncRoot)和下边的操作作用是一样的.
    static object obj = new object();
    lock(obj)
    {
       
    //一些操作
    }

    他们之间不同的是,我们声明的static object类型对象是类型级别的,而SyncRoot是对象级别的。

    通过上面的分析,我们都应该能理解Synchronized 和 SyncRoot用法,他们之间的关系就是:
    Hashtable通过Synchronized方法,生成一个SynchHashtable类型的对象,在这个对象的一个方法中,通过lock (this._table.SyncRoot)这样的代码来实现线程安全的操作,其中this._table.SyncRoot返回的就是一个object类型的对象,在一个SynchHashtable对象实例中,不管我们调用多少次,他是唯一的。

  • 相关阅读:
    section_4.python操作mysqlsql注入导入导出数据库
    section_3.单表多表查询
    section_2.约束索引存储引擎
    Section_1.Mysql基础
    day7.线程-线程队列进程池和线程池回调函数协程
    Mysql小技巧总汇
    常用对照表的参考_chapter-one(Content-Type)
    ORACLE 数据库配置
    Shiro入门(用户权限控制)
    Quartz定时任务调度机制解析(CronTirgger、SimpleTrigger )
  • 原文地址:https://www.cnblogs.com/fengfeng/p/1242335.html
Copyright © 2011-2022 走看看