Tag: 并发

为什么ConcurrentBag <T>在.Net(4.0)中很慢? 我做错了吗?

在开始一个项目之前,我写了一个简单的testing来比较来自(System.Collections.Concurrent)的ConcurrentBag相对于locking和列表的性能。 我感到非常惊讶的是,ConcurrentBag比locking一个简单的列表要慢10倍以上。 据我所知,当读者和作者是同一个线程时,ConcurrentBag效果最好。 但是,我没有想到它的性能会比传统的锁更糟糕。 我已经运行了一个testing,用两个Parallel for循环写入和从列表/包中读取。 但是,写本身就performance出巨大的差异: private static void ConcurrentBagTest() { int collSize = 10000000; Stopwatch stopWatch = new Stopwatch(); ConcurrentBag<int> bag1 = new ConcurrentBag<int>(); stopWatch.Start(); Parallel.For(0, collSize, delegate(int i) { bag1.Add(i); }); stopWatch.Stop(); Console.WriteLine("Elapsed Time = {0}", stopWatch.Elapsed.TotalSeconds); } 在我的盒子里,这需要3-4秒的时间才能运行,相比之下,这个代码是0.5 – 0.9秒: private static void LockCollTest() { int collSize = 10000000; object list1_lock=new […]

在Java中select最好的并发列表

我的线程池有固定数量的线程。 这些线程需要经常从共享列表中读写 。 那么,在这种情况下, java.util.concurrent包中的哪个数据结构(最好是List,必须是无监视器的)呢?

Java中的ThreadFactory用法

有人可以简单地解释何时和何时使用ThreadFactory? 有和没有使用ThreadFactory的例子可能对理解差异很有帮助。 谢谢!

如何减lessjava并发模式失败和过度gc

在Java中,并发模式失败意味着并发收集器未能释放足够的内存空间,不得不放弃永久创造,而不得不放弃让全球停止的 gc进入。最终结果可能非常昂贵。 我理解这个概念,但从来没有很好的全面理解 A)什么可能导致并发模式失败 B)解决scheme是什么? 这种不清楚的地方导致我在编写/debugging代码时没有多less提示,经常需要从Foo到Bar的性能标志而没有特别的原因,只需要尝试一下。 我想在这里向开发人员学习你的经验如何? 如果遇到这样的性能问题,原因是什么以及如何解决? 如果您有编码build议,请不要太笼统。 谢谢!

LinkedBlockingQueue的insert和remove方法是否线程安全?

我在两个不同的线程之间使用LinkedBlockingQueue 。 一个线程通过add添加数据,而另一个线程通过take接收数据。 我的问题是,我需要同步访问add和take 。 LinkedBlockingQueue的insert和remove方法是否线程安全?

scala.concurrent.blocking – 它实际上做了什么?

我花了一段时间学习Scala执行上下文,底层线程模型和并发的主题。 你可以解释scala.concurrent.blocking “调整运行时行为”和“可以提高性能或避免死锁”的方式吗? 在文档中 ,它是作为一种手段来等待api不能实现的。 (也许只是长时间运行的计算应该被包装?)。 它到底是什么? 通过源头不容易背叛其秘密。

不变性和重新sorting

评论接受的答案 这个问题产生的热量比我想象中的要多得多。 一个重要的结论,我从与并发利益邮件列表成员(即实际工作的人)的公共和私人讨论中吸取了一些重要的结论: 如果你可以find一个顺序一致的重新sorting,不会中断任何线程间发生的关系,这是一个有效的重新sorting(即符合程序顺序规则和因果关系要求)。 约翰·文特(John Vint)在他的回答中提供了这一点。 原来的问题 下面的代码(Java Concurrency in Practice列表16.3)不是线程安全的,原因很明显: public class UnsafeLazyInitialization { private static Resource resource; public static Resource getInstance() { if (resource == null) resource = new Resource(); // unsafe publication return resource; } } 然而,在几页之后的16.3节中,他们指出: 如果 Resource不可变, UnsafeLazyInitialization实际上是安全的。 我不明白这个说法: 如果Resource是不可变的,那么任何观察resourcevariables的线程将会看到它为null或完全构造(由于Java Memory模型提供的最终字段的强有力的保证) 然而,没有什么可以防止指令重新sorting:特别是两个resource读取可以重新sorting(有一个读取的if和return )。 所以一个线程可以在if条件中看到一个非null的resource ,但返回一个空引用(*)。 我认为即使Resource是不可变的, UnsafeLazyInitialization.getInstance()也可以返回null。 是这样,为什么(或为什么不)? 注:我期望有一个有争议的答案,而不是单纯的是或否的陈述。 (*)为了更好地理解我关于重新sorting的观点,作为JLS第17章并发性之一的作者之一的Jeremy […]

互斥体如何实现?

对于特定的应用程序,有些实现比其他实现更好吗 有没有什么可以通过推出自己的?

TVar和TMVar的区别

我已经看到了TVar是一个简单的容器,而TMVar和MVar是一样的,意思是它有一个锁等,但是在STM monad中。 我想知道为什么这是必要的,因为STM的想法是不需要锁。 那么,如果你有一个像[Handle]types的套接字句柄的列表,你希望在forkIO之间使用哪个线程呢?

读取一个不locking的并发修改的整数variables是否安全?

假设我在一个类中有一个整型variables,这个variables可能会被其他线程同时修改。 写入受互斥体保护。 我还需要保护阅读吗? 我听说有一些硬件体系结构,如果一个线程修改一个variables,另一个线程读取它,那么读取的结果将是垃圾; 在这种情况下,我确实需要保护读取。 我从来没有见过这样的体系结构。 这个问题假定单个事务只包含更新一个整型variables,所以我不担心任何其他variables的状态也可能涉及到一个事务。