5

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

例如:

  • 为什么在同步集合上使用并发集合?
  • 什么时候应该优先使用原子类而不是显式锁定?
  • 什么时候应该使用锁而不是同步?
  • wait() 和 notify()、notifyAll() 的替代方法是什么?
  • 什么时候应该使用 CompletionService?

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

4

2 回答 2

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

因为synchronized集合只保护数据不因并发访问而损坏。这并不意味着synchronized集合针对并发访问进行了优化。事实上,远非如此 - aConcurrentMap.putIfAbsent是一种compareAndSet比锁定整个Map读取更好的机制。

  • 什么时候应该优先使用原子类而不是显式锁定?

和类应该总是使用(在我看来)AtomicIntegerAtomicLong不是用原语手动锁定,因为它们更简洁。考虑:

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

与以下相比:

int old = counter.getAndIncrement();

但我不得不说,这些课程因缺乏等待性而受苦。例如,您经常需要一些同步的布尔值,您wait在布尔条件下。这些WaitableBoolean在旧的 Doug Lea 并发库中是可用的,但它们被抛弃了j.u.c,我不知道为什么。

  • 什么时候应该使用锁而不是同步?

这是一个更复杂的问题,因为使用会Locks带来一些开销。事实上,人们常说ReadWriteLock典型情况下使用 a 没有品脱。必须使用锁的一种情况是资源的锁定和解锁不能在同一个词法范围内完成synchronized在这种情况下无能为力。

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

await,signalsignalAll

  • 什么时候应该使用 CompletionService?

在以下情况下,完成服务很有用你的程序知道。例如,这可能是为了监控失败任务(引发异常)的比例,或者可能是为了资源清理。

于 2009-09-04T06:35:34.543 回答
2
What are the alternatives to wait() and notify(), notifyAll()

wait()、notify()notifyAll()的一个很好的替代方法是根本不使用它们。

这里有 200KLOC 代码库,它是高度多线程的。我们将负载分散到无数核心上,并拥有大量生产者/消费者计划等。

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

零。

我再次强调它是一个高度多线程的应用程序:*闩锁、毒丸、java.util.concurrent.**等等。但是wait()、notify()notifyAll():零个实例。

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

来自 Joshua Bloch,在“Effective Java”中,在“线程”一章的开头:

“如果有一个库可以让你免于进行低级多线程编程,那么一定要使用它。”

于 2010-03-29T20:14:03.270 回答