让你的收藏线程安全吗?

cor*_*ore 9 c# java collections multithreading

在设计集合类时,有没有理由不私下实现锁定以使其线程安全?或者我应该将该责任留给收藏的消费者?

Ori*_*rds 13

是否有任何理由不私下实现锁定以使其线程安全?

这取决于.你的目标是编写一个由多个线程访问的集合类吗?如果是这样,请使其线程安全.如果没有,不要浪费你的时间.当人们谈论"过早优化"时,人们会提到这种事情

解决你遇到的问题.不要试图解决你认为未来几年可能会遇到的未来问题,因为你无法看到未来,而且你总是会出错.

注意:您仍然需要以可维护的方式编写代码,这样如果您确实需要出现并为集合添加锁定,那就不会非常困难.我的观点是"不要实现你不需要也不会使用的功能"

  • 如果你担心多线程性能,我不确定我是否会购买它不会非常困难.它很容易做到天真,但很难做得很好.去看看ConcurrentHashMap的代码与HashMap. (2认同)

fli*_*ken 10

对于Java,您应该保持不同步的速度.如果需要,集合的使用者可以包装在同步包装器中.


Oha*_*der 6

线程安全集合可能是欺骗性的.Jared Par发表了一些关于线程安全集合的有趣文章:

问题是有几个级别的线程安全集合.我发现当大多数人说线程安全收集他们真正的意思是"一个集合,当修改和从多个线程访问时不会被破坏"

...

但是,如果构建数据线程安全列表非常简单,为什么Microsoft不在框架中添加这些标准集合?

答案:ThreadSafeList是一个几乎无法使用的类,因为该设计会引导您走向错误代码的道路.

在您研究如何使用列表之前,此设计中的缺陷并不明显.例如,如果有的话,请使用以下代码尝试从列表中获取第一个元素.

static int GetFirstOrDefault(ThreadSafeList<int> list) {
    if (list.Count > 0) {
        return list[0];
    }
    return 0; }
Run Code Online (Sandbox Code Playgroud)

此代码是典型的竞争条件.考虑列表中只有一个>元素的情况.如果另一个线程在if语句和return语句之间删除了该元素,则return语句将抛出异常,因为它试图访问列表中的无效索引.即使ThreadSafeList是数据线程安全的,也没有什么能保证在下一次调用同一个对象时一个调用的返回值的有效性

http://blogs.msdn.com/b/jaredpar/archive/2009/02/11/why-are-thread-safe-collections-so-hard.aspx

http://blogs.msdn.com/b/jaredpar/archive/2009/02/16/a-more-usable-thread-safe-collection.aspx