2009-09-04 28 views
5

我已阅读Java Concurrency in Practice,这是一个很好的参考资料,但我希望看到java.util.concurrent包的用例简明单页摘要。用于Java并发实用程序的用例

例如:

  • 为什么使用并发收集了同步采集?
  • 什么时候应该将原子类优先于显式锁定?
  • 何时应该使用锁定进行同步?
  • 什么是wait()和notify(),notifyAll()的替代方法?
  • 什么时候应该使用CompletionService?

要了解哪些优缺点和缺陷?

+0

这听起来像是作业问题。 – 2009-09-04 02:50:11

+0

不是:)只是一个快速参考,为工作选择正确的工具。 – parkr 2009-09-04 03:09:44

+0

所以你看了这本书,仍然有这些问题? – pek 2009-09-04 06:51:56

回答

11
  • 为什么在同步集合上使用并发集合?

因为​​集合只能保护数据免受并发访问造成的损坏。这并不意味着​​集合优化并行访问。事实上 - 对于compareAndSet来说,一个ConcurrentMap.putIfAbsent对于读取锁定整个Map是一个更好的机制。

  • 什么时候应该将原子类优先于显式锁定?

AtomicIntegerAtomicLong类应始终使用(在我看来)以上,因为它们更简洁用手具有基本锁定。试想一下:

synchronized (lock) { 
    int old = counter; 
    counter++; 
    return old; 
} 

的情况相比:

int old = counter.getAndIncrement(); 

我不得不说虽然,该班从他们缺乏waitability之苦。例如,您经常需要一些布尔条件下的wait同步布尔值。这些在旧的Doug Lea并发库中是WaitableBoolean,但它们在j.u.c被抛弃,我不知道为什么。

  • 何时应该使用Locks进行同步?

这是一个更复杂的问题,因为Locks的使用会带来一些开销。事实上,人们经常说在典型的案件中使用ReadWriteLock没有品脱。一种场景其中必须使用锁是锁定资源及其解锁不能在同一个词汇范围中完成的地方。​​在这些情况下无力帮助。

  • 什么是wait()和notify(),notifyAll()的替代方法?

awaitsignalsignalAll

  • 当应在CompletionService使用?

完成服务是在一个计算结果的消耗并不需要在计算提交的点进行访问,但其中是很重要的情况下有用的计算完成(或其结果,或成功)由您的程序知道。例如,这可能是监视失败任务(抛出异常)的比例,或者可能是资源清理。

+0

锁的一个用例是当你想为不同的客户实现不同的实现时。例如,一个多线程客户端可以使用标准锁,一个单线程的noop锁,并且在负载测试中用于争用条件检测时,您可能希望使用一个中止并发访问的锁。 – user58804 2009-09-06 22:19:54

2
What are the alternatives to wait() and notify(), notifyAll() 

一个很好的替代等待(),通知()notifyAll的()不使用它们ALL

200KLOC代码库这里是沉重多线程。我们正在蔓延无数核上的负载,并有生产者/消费者方案等的军队

等待(),通知()notifyAll的()在我们的代码

实例?

零。

我重新强调它是一个严重的多线程应用程序这一事实:*锁存器,毒丸,java.util.concurrent。**和任何地方无处不在。但是wait(),notify()notifyAll():零实例。

这是真的只应用于并发实用程序/框架的底层内容。

从约书亚布洛赫,在“有效的Java”,在“新语丝”章的开始:

“如果有,可以节省你做低层次多库线程编程,通过一切手段使用它。“