b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

C#多线程编程之:集合类中Synchronized方法与SyncRoot属性原理简析(转)(2)

电脑杂谈  发布时间:2019-10-02 07:02:52  来源:网络整理

呵呵,果然不出我们所料,SyncHashtable果然继承自Hashtable,SyncHashtable之所有能实现线程的安全操作c# 多线程 syncroot,就是因为在人们的一些技巧中,就加了lock,我们明白c# 多线程 syncroot,哪一个线程执行了lock操作,在他还没有释放lock之前,其他线程都要进入堵塞状况。 SyncHashtable就是通过这些方式,来推动所谓的线程安全。

c++线程死锁_c# 多线程 syncroot_c++ 线程死锁

现在我们理解了Synchronized的涵义和用法,那接下来我们说说他和SyncRoot之间的关系。

SyncRoot表示获得可用于同步 Hashtable 访问的对象,老实说,这个解释不好理解,要想真正理解他的用法,我们还得从源码开始:

1 public virtual object SyncRoot
2 {
3 get
4 {
5 if (this._syncRoot == null)
6 {
7 Interlocked.CompareExchange(ref this._syncRoot, new object(), null);
8 }
9 return this._syncRoot;
10 }
11 }

如果您知道Interlocked的用法,这段代码没哪个难理解的了(不明白的同学找GOOGLE吧),Interlocked为多个线程共享的数组提供原子操作。原子操作就是单线程操作。在一个Hashtable实例中,不论我们在代码的任何位置读取SyncRoot,返回的都是同一个object类型的对象。我们在起初写的lock(ht.SyncRoot)和上面的操作作用是一样的:

c++ 线程死锁_c# 多线程 syncroot_c++线程死锁

1 static object obj = new object();
2 lock(obj)
3 {
4 ......
5 }

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

通过下面的预测,我们都需要能理解Synchronized 和 SyncRoot用法,他们之间的关系就是:

Hashtable 通过Synchronized方法,生成一个SynchHashtable类型的对象,在这个对象的一个方法中,通过lock (this._table.SyncRoot)这样的代码来实现线程安全的操作,其中this._table.SyncRoot返回的就是一个 object类型的对象,在一个SynchHashtable对象例子中,不管我们调用多少次,他是唯一的。

c++线程死锁_c# 多线程 syncroot_c++ 线程死锁

另外,针对数组集合的轮询安全访问,由于线程集合中没有直接公布SyncRoot属性,所以猛一听好像无从下手。

但是查看集合赋值集合的源代码后就可发现它们实际上都提供了SyncRoot属性。

以下以Queue<T>集合为例。

1 bool ICollection.IsSynchronized
2 {
3 get
4 {
5 return false;
6 }
7 }
8
9 object ICollection.SyncRoot
10 {
11 get
12 {
13 if (this._syncRoot == null)
14 {
15 Interlocked.CompareExchange(ref this._syncRoot, new object(), null);
16 }
17 return this._syncRoot;
18 }
19 }

从以下源代码可以看出,这两个方法都被实现为了显式接口,所以需要将其显式转型为ICollection后才会使用。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-124838-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    每日福利
    热点图片
    拼命载入中...