标签: concurrency

活锁的好例子?

我理解livelock是什么,但我想知道是否有人有一个很好的基于代码的例子呢?以代码为基础,我并不是说"两个人试图在走廊里相互过去".如果我再读一遍,我会失去午餐.

concurrency livelock

137
推荐指数
4
解决办法
6万
查看次数

从多个线程获取java.util.HashMap中的值是否安全(无需修改)?

有一种情况会构建一个地图,一旦它被初始化,它将永远不会被再次修改.但是,它将从多个线程访问(仅通过get(key)).java.util.HashMap以这种方式使用是否安全?

(目前,我很高兴使用a java.util.concurrent.ConcurrentHashMap,并没有明确的需要提高性能,但我只是好奇,如果一个简单HashMap就足够了.因此,这个问题不是 "我应该使用哪一个?"也不是性能问题.相反,问题是"它会安全吗?")

java concurrency multithreading hashmap

135
推荐指数
8
解决办法
6万
查看次数

Java易失性参考与AtomicReference

volatileObject引用之间是否有任何区别AtomicReference,如果我只使用get()set()-methods AtomicReference

java concurrency

130
推荐指数
4
解决办法
4万
查看次数

格林莱特与 主题

我是gevents和greenlets的新手.我找到了一些关于如何使用它们的好文档,但是没有一个能让我证明我应该如何以及何时使用greenlets!

  • 他们真正擅长什么?
  • 在代理服务器中使用它们是不是一个好主意?
  • 为什么不是线程?

我不确定的是,如果它们基本上是共同惯例,它们如何为我们提供并发性.

python concurrency coroutine gevent greenlets

130
推荐指数
4
解决办法
4万
查看次数

哪种并行排序算法具有最佳的平均案例性能?

排序在串行情况下需要O(n log n).如果我们有O(n)处理器,我们希望线性加速.存在O(log n)并行算法,但它们具有非常高的常数.它们也不适用于没有O(n)处理器附近的商品硬件.对于p个处理器,合理的算法应该花费O(n/p log n)时间.

在串行的情况下,快速排序平均具有最佳的运行时复杂性.并行快速排序算法易于实现(请参见此处此处).但是它表现不佳,因为第一步是将整个集合划分到单个核心上.我已经找到了许多并行排序算法的信息,但到目前为止我还没有看到任何指向明显赢家的信息.

我希望在运行8到32个内核的JVM语言中对100万到1亿个元素的列表进行排序.

sorting algorithm concurrency

127
推荐指数
2
解决办法
6万
查看次数

Java中不同类型的线程安全集

似乎有很多不同的实现和方法在Java中生成线程安全的集合.一些例子包括

1)CopyOnWriteArraySet

2)Collections.synchronizedSet(Set set)

3)ConcurrentSkipListSet

4)Collections.newSetFromMap(new ConcurrentHashMap())

5)以类似于(4)的方式生成的其他集合

这些示例来自Java 6中的并发模式:并发集实现

有人可以简单解释这些例子和其他例子的差异,优点和缺点吗?我无法理解并保持Java Std Docs中的所有内容.

java concurrency set

126
推荐指数
3
解决办法
8万
查看次数

我应该在Java中使用哪个并发队列实现?

来自JavaDocs:

  • 的ConcurrentLinkedQueue是当许多线程共享访问一个共同的集合一个合适的选择.此队列不允许null元素.
  • ArrayBlockingQueue是一个经典的"有界缓冲区",其中固定大小的数组包含由生产者插入并由消费者提取的元素.此类支持用于排序等待生产者和消费者线程的可选公平策略
  • LinkedBlockingQueue通常具有比基于阵列的队列更高的吞吐量,但在大多数并发应用程序中具有较低的可预测性能.

我有两个场景,一个需要队列支持许多生产者(使用它的线程)与一个消费者,另一个是另一种方式.

我不明白使用哪种实现.有人可以解释一下这些差异是什么吗?

此外,什么是"可选的公平政策" ArrayBlockingQueue

java queue concurrency multithreading

123
推荐指数
3
解决办法
10万
查看次数

.NET - 字典锁定与ConcurrentDictionary

我找不到关于ConcurrentDictionary类型的足够信息,所以我想我会在这里问一下.

目前,我使用a Dictionary来保存由多个线程(来自线程池,因此没有确切数量的线程)不断访问的所有用户,并且它具有同步访问权限.

我最近发现在.NET 4.0中有一组线程安全的集合,它似乎非常令人愉快.我想知道,什么是"更有效和更容易管理"的选项,因为我可以选择正常Dictionary的同步访问,或者具有ConcurrentDictionary已经线程安全的选项.

参考.NET 4.0 ConcurrentDictionary

.net concurrency dictionary concurrentdictionary

121
推荐指数
6
解决办法
6万
查看次数

什么时候使用volatile多线程?

如果有两个线程访问全局变量,那么许多教程都说使变量volatile变为阻止编译器将变量缓存在寄存器中,从而无法正确更新.但是,访问共享变量的两个线程是通过互斥锁来调用保护的东西不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有那个线程可以访问变量,在这种情况下变量不需要是volatile?

那么多线程程序中volatile的用途/目的是什么?

c++ concurrency multithreading atomic volatile

121
推荐指数
3
解决办法
5万
查看次数

无法制作具有大小限制的缓存线程池?

似乎不可能创建一个缓存的线程池,它可以创建的线程数限制.

以下是在标准Java库中实现静态Executors.newCachedThreadPool的方法:

 public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}
Run Code Online (Sandbox Code Playgroud)

因此,使用该模板继续创建固定大小的缓存线程池:

new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Run Code Online (Sandbox Code Playgroud)

现在,如果你使用它并提交3个任务,一切都会好的.提交任何进一步的任务将导致被拒绝的执行异常.

试试这个:

new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Run Code Online (Sandbox Code Playgroud)

将导致所有线程按顺序执行.即,线程池永远不会有多个线程来处理您的任务.

这是ThreadPoolExecutor的execute方法中的错误?或者这可能是故意的?还是有其他方式?

编辑:我想要一些与缓存线程池完全相同的东西(它根据需要创建线程,然后在一些超时后杀死它们)但是它可以创建的线程数量受到限制,并且一旦有了它就能够继续排队其他任务达到了它的线程限制.根据sjlee的回应,这是不可能的.查看ThreadPoolExecutor的execute()方法确实是不可能的.我需要继承ThreadPoolExecutor并覆盖execute(),就像SwingWorker一样,但SwingWorker在其execute()中所做的是一个完整的hack.

java concurrency multithreading executorservice threadpoolexecutor

118
推荐指数
5
解决办法
5万
查看次数