首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么List<T>不是线程安全的?

为什么List<T>不是线程安全的?
EN

Stack Overflow用户
提问于 2009-04-01 03:49:57
回答 6查看 29.8K关注 0票数 44

来自以下网站:

http://crfdesign.net/programming/top-10-differences-between-java-and-c

不幸的是,List<>并不是线程安全的(C#的ArrayListVector是线程安全的)。C#还有一个Hashtable;通用版本是:

什么使List<T>不安全线程?这是.NET框架工程师部分的实现问题吗?还是泛型不是线程安全的?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-04-01 03:55:54

您确实需要对Java Vector的线程安全类型进行分类。Javas在多个线程中使用是安全的,因为它在方法上使用同步。状态不会被破坏。

但是,Java向量的有用性仅限于多个线程,而不需要额外的同步。例如,考虑从向量读取元素的简单操作。

代码语言:javascript
运行
复制
Vector vector = getVector();
if ( vector.size() > 0 ) { 
  object first = vector.get(0);
}

这种方法不会破坏向量的状态,但也是不正确的。没有什么可以阻止另一个线程在if语句和get()调用之间对向量进行变异。这段代码可以并且最终会因为竞争条件而失败。

这种类型的同步只在大量的场景中有用,当然也不便宜。即使不使用多个线程,也要为同步付出显著的代价。

在默认情况下,.Net选择不支付这个代价,因为它的实用性有限。相反,它选择实现一个无锁列表。作者负责添加任何同步。它更接近于C++的“只为你使用的东西付费”的模式。

我最近写了几篇关于只使用内部同步的集合的危险性的文章,比如Java的向量。

  • 为什么线程安全的收集如此困难?
  • 用于可变线程安全集合的更有用的API。

参考向量线程安全:http://www.ibm.com/developerworks/java/library/j-jtp09263.html

票数 69
EN

Stack Overflow用户

发布于 2009-04-01 03:54:55

为什么它是线程安全的?不是每个班级都是。实际上,在默认情况下,类并不是线程安全的。

线程安全意味着修改列表的任何操作都需要针对同时访问进行互锁。这对于那些只被单个线程使用的列表来说也是必要的。那将非常低效。

票数 21
EN

Stack Overflow用户

发布于 2009-04-01 03:58:11

实现非线程安全的类型只是一个设计决策。集合为某些集合提供了接口SyncRoot的属性ICollectionSynchronized()方法,以显式同步数据类型。

使用SyncRoot在多线程环境中锁定对象。

代码语言:javascript
运行
复制
lock (collection.SyncRoot)
{
   DoSomething(collection);
}

使用collection.Synchronized()获取集合的线程安全包装器。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/703990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档