Java并发实用程序的用例

par*_*rkr 5 java concurrency summary

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

例如:

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

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

oxb*_*kes 11

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

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

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

AtomicIntegerAtomicLong类,应始终使用(在我看来)以上,因为它们更简洁用手具有基本锁定.考虑:

synchronized (lock) { 
    int old = counter;
    counter++;
    return old;
}
Run Code Online (Sandbox Code Playgroud)

与以下相比:

int old = counter.getAndIncrement();
Run Code Online (Sandbox Code Playgroud)

我不得不说,这些课程因缺乏可靠性而受到影响.例如,您经常需要一些同步布尔值,其中您wait处于布尔条件.这些可以WaitableBoolean在旧的Doug Lea并发库中获得,但它们被抛弃了j.u.c,我不知道为什么.

  • 何时应该使用Locks同步?

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

  • wait()和notify(),notifyAll()有哪些替代方法?

await,signalsignalAll

  • 应该何时使用CompletionService?

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