来自以下网站:
http://crfdesign.net/programming/top-10-differences-between-java-and-c
不幸的是,
List<>
并不是线程安全的(C#的ArrayList
和Vector
是线程安全的)。C#还有一个Hashtable
;通用版本是:
什么使List<T>
不安全线程?这是.NET框架工程师部分的实现问题吗?还是泛型不是线程安全的?
发布于 2009-04-01 03:55:54
您确实需要对Java Vector的线程安全类型进行分类。Javas在多个线程中使用是安全的,因为它在方法上使用同步。状态不会被破坏。
但是,Java向量的有用性仅限于多个线程,而不需要额外的同步。例如,考虑从向量读取元素的简单操作。
Vector vector = getVector();
if ( vector.size() > 0 ) {
object first = vector.get(0);
}
这种方法不会破坏向量的状态,但也是不正确的。没有什么可以阻止另一个线程在if语句和get()调用之间对向量进行变异。这段代码可以并且最终会因为竞争条件而失败。
这种类型的同步只在大量的场景中有用,当然也不便宜。即使不使用多个线程,也要为同步付出显著的代价。
在默认情况下,.Net选择不支付这个代价,因为它的实用性有限。相反,它选择实现一个无锁列表。作者负责添加任何同步。它更接近于C++的“只为你使用的东西付费”的模式。
我最近写了几篇关于只使用内部同步的集合的危险性的文章,比如Java的向量。
参考向量线程安全:http://www.ibm.com/developerworks/java/library/j-jtp09263.html
发布于 2009-04-01 03:54:55
为什么它是线程安全的?不是每个班级都是。实际上,在默认情况下,类并不是线程安全的。
线程安全意味着修改列表的任何操作都需要针对同时访问进行互锁。这对于那些只被单个线程使用的列表来说也是必要的。那将非常低效。
发布于 2009-04-01 03:58:11
实现非线程安全的类型只是一个设计决策。集合为某些集合提供了接口SyncRoot
的属性ICollection
和Synchronized()
方法,以显式同步数据类型。
使用SyncRoot
在多线程环境中锁定对象。
lock (collection.SyncRoot)
{
DoSomething(collection);
}
使用collection.Synchronized()
获取集合的线程安全包装器。
https://stackoverflow.com/questions/703990
复制相似问题