Tag: 并发

Java Queue的实现,哪一个?

来自Javadoc: ConcurrentLinkedQueue是许multithreading将共享访问共享集合的合适select。 该队列不允许空元素。 ArrayBlockingQueue是一个经典的“有界缓冲区”,其中一个固定大小的数组包含生产者插入的元素,并由消费者提取。 这个类支持一个可选的公平策略来sorting等待的生产者和消费者线程 LinkedBlockingQueue通常比基于arrays的队列具有更高的吞吐量,但是在大多数并发应用程序中性能较差。 我有两个场景,一个需要队列支持许多生产者(线程使用它)与一个消费者,另一个是相反的方式。 我不明白是否应该使用ConcurrentLikedQueue或其他(数组或LinkedList实现)。 Wherent'所有这些实现应该是并发的? 我的意思是,有人可以解释我ConcurrentLikedQueue和LinkedBlockingQueue什么区别吗? 另外, ArrayBlockingQueue的可选公平策略是什么?

.NET – 字典locking与ConcurrentDictionary

我无法find关于ConcurrentDictionarytypes的足够信息,所以我想我会在这里问一下。 目前,我使用一个Dictionary来保存所有由多个线程(从一个线程池,所以没有确切数量的线程)不断访问的用户,并且它已经同步访问。 我最近发现在.NET 4.0中有一组线程安全的集合,它看起来非常令人愉快。 我想知道,什么是“更有效和更容易pipe理”选项,因为我有一个正常的Dictionary与同步访问之间的选项,或者有一个已经线程安全的ConcurrentDictionary 。 参考.NET 4.0的ConcurrentDictionary

Executors.newCachedThreadPool()与Executors.newFixedThreadPool()

newCachedThreadPool()与newFixedThreadPool() 我应该什么时候使用其中一个? 哪种策略在资源利用方面更好?

迭代ConcurrentHashMap值线程安全吗?

在javadoc中用于ConcurrentHashMap的是: 检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。 检索反映了最近完成的更新操作的结果。 对于像putAll和clear这样的集合操作,并发检索可能反映只插入或删除一些条目。 类似地,迭代器和枚举在创build迭代器/枚举时或之后返回反映哈希表状态的元素。 他们不会抛出ConcurrentModificationException。 但是,迭代器一次只能被一个线程使用。 这是什么意思? 如果我尝试用两个线程同时迭代地图会发生什么? 如果我在迭代时从地图上放置或删除一个值,会发生什么?

Java易失性参考与AtomicReference

如果我只是使用AtomicReference中的get()和set()方法,那么在volatile对象引用和AtomicReference之间是否有区别?

活锁的好例子?

我知道什么是活锁,但我想知道是否有人有一个好的基于代码的例子呢? 而通过基于代码的方式,我不是指“两个人在走廊上试图相互穿越”。 如果我再读一遍,我会失去午餐。

Java并发性:倒数锁存与循环障碍

我正在阅读java.util.concurrent API ,发现 CountDownLatch :允许一个或多个线程等待,直到在其他线程中执行的一组操作完成的同步辅助。 CyclicBarrier :一种同步协助,它允许一组线程互相等待,以达到一个共同的障碍点。 对我来说,两者似乎是平等的,但我相信还有更多。 例如,在CoundownLatch, the countdown value could not be reset, that can happen in the case of CyclicBarrier 。 两者之间还有其他的区别吗? 有人想要重置倒计时值的use cases是什么?

未来与承诺的区别

Future和Promise什么区别? 他们都是未来结果的占位符,但主要区别在哪里?

iPhone – Grand Central调度主线程

我一直在使用成功,在我的应用程序的大中央调度,但我想知道什么是使用这样的事情的真正优势: dispatch_async(dispatch_get_main_queue(), ^{ … do stuff 甚至 dispatch_sync(dispatch_get_main_queue(), ^{ … do stuff 我的意思是,在这两种情况下,你都是在主线程上发射一个块,在应用程序运行的地方,这对减轻负载无济于事。 在第一种情况下,当模块运行时,您无法进行任何控制。 我已经看到了在你开火半秒之后被执行的情况。 第二种情况,它类似于 [self doStuff]; 对? 我想知道你们是怎么想的。

同步与locking

java.util.concurrent API提供了一个名为Lock的类,它基本上将序列化控件以访问关键资源。 它提供了诸如park()和unpark() 。 如果我们可以使用synchronized关键字并使用wait()和notify() notifyAll()方法,我们可以做类似的事情。 我想知道哪一个在实践中更好,为什么?