Java并发实用程序的用例

时间:2009-09-04 02:44:35

标签: java concurrency summary

我已经阅读了Java Concurrency in Practice,这是一个很好的参考,但我希望看到java.util.concurrent包的用例的简明单页摘要。

例如:

  • 为什么在同步集合中使用并发集合?
  • 原型类何时应优先于显式锁定?
  • 何时应该使用Locks同步?
  • wait()和notify(),notifyAll()?
  • 的替代方法是什么?
  • 何时应使用CompletionService?

需要注意哪些优点/缺点和缺陷?

2 个答案:

答案 0 :(得分:11)

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

因为synchronized集合仅保护数据免于因并发访问而导致的损坏。这并不意味着synchronized集合优化以进行并发访问。事实上,对于ConcurrentMap.putIfAbsent来说,compareAndSet是一个更好的机制,而不是锁定读数的整个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没有任何品脱。一个场景必须使用锁是资源的锁定及其解锁无法在同一个词法范围中完成的地方。 synchronized无法帮助处理此类案件。

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

awaitsignalsignalAll

  • 何时应使用CompletionService?

如果在提交计算时不需要访问计算结果的消耗,但重要表示完成,则完成服务非常有用。计算(或其结果或成功)可由您的程序知道。例如,这可能是为了监控失败任务的比例(抛出异常),或者可能是资源清理。

答案 1 :(得分:2)

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

wait(),notify() notifyAll()的一个非常好的替代方法是不使用它们

这里的200KLOC代码库严重多线程。我们正在扩大无数核心的负担,并有生产者/消费者计划的军队等。

我们的代码中 wait(),notify() notifyAll()的实例?

零。

我重新强调它是一个多线程的应用程序:* latches,poison pills,java.util.concurrent。**和whatnots 无处不在。但 wait(),notify() notifyAll():零实例。

这是真正的低级别的东西,只应该在并发实用程序/框架中使用它。

来自“Effective Java”的Joshua Bloch,在“Threads”章节的最开头:

“如果有一个库可以帮助您避免进行低级多线程编程,请务必使用它。”