请问各位,在访问线程安全容器SynchronizedCollection元素时一定要加锁lock(this.SyncRoot)吗????

d0347 2014-05-05 09:06:45
/*1.定义一个书本类*/
public class TBook{
public string BookNo="";
public string BookName="";
public string BookPictureURL="";//书本封面图url
// ....
}

/*2.书本链表*/
public class TBookList : SynchronizedCollection<TBook>{
//...
//通过编号获取书本信息
public TBook NoOfBook(string aBookNo){
TBook b= new TBook();
lock(this.SyncRoot) //加锁,请问各位兄弟这句lock是否可以去掉 ????
{
for(int iLoop=0; iLoop<this.Count; iLoop++){
b=this[iLoop];
if (b.BookNo==aBookNo) return b;
}
}
return b; //返加没有编号的TBook,表示NoOfBook失败
}//end of public TBook NoOfBook...
}


请问各位,在访问SynchronizedCollection元素一定要加锁lock(this.SyncRoot)
...全文
304 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
d0347 2014-05-05
  • 打赏
  • 举报
回复
to: findcaiyzh 你好, 我看了一下 SynchronizedCollection 构造函数如下: public SynchronizedCollection() { this.items = new List<T>(); this.sync = new object(); //这里已经初始化了sync ... } //已经初始化了syncObject 了,那么我可以直接访问元素了吗?类似以下的代码 TBookList bList= new TBookList (); for(int iLoop=0; iLoop<bList.Count; iLoop++){ TBook b= bList[iLoop]; //... }
宝_爸 2014-05-05
  • 打赏
  • 举报
回复
我觉得不用 ,以下是反编译的Item[index]的代码,已经有lock了。 初始化SynchronizedCollection 实例的时候,使用合适的Object作为Sync Object即可。

public T this[int index]
{
    get
    {
        lock (this.sync)
        {
            return this.items[index];
        }
    }
    set
    {
        lock (this.sync)
        {
            if ((index < 0) || (index >= this.items.Count))
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("index", index, SR.GetString("ValueMustBeInRange", new object[] { 0, this.items.Count - 1 })));
            }
            this.SetItem(index, value);
        }
    }
}

d0347 2014-05-05
  • 打赏
  • 举报
回复
to: moranhuoshou 是多线程并发的, 但又据说 SynchronizedCollection 是线程安全的,真不知是否可以去掉???
SeeYou孙悟空 2014-05-05
  • 打赏
  • 举报
回复
你的是多线程并发的吗?如果是的话,是不可以去掉的。
d0347 2014-05-05
  • 打赏
  • 举报
回复
TBookList bList= new TBookList (); //... lock(bList.SyncRoot) //外部类访问bList也一定要使用lock加锁吗??? { for(int iLoop=0; iLoop<bList.Count; iLoop++){ //... } } //外部类访问bList也一定要使用lock加锁吗???
d0347 2014-05-05
  • 打赏
  • 举报
回复
请问各位,在访问SynchronizedCollection元素一定要加锁lock(this.SyncRoot) 吗??是否可以去掉???

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧