用于Java并发实用程序的用例

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

例如:

  • 为什么在同步集合上使用并发集合?
  • 原子类何时应该优于显式锁定?
  • Locks何时应该用于同步?
  • wait()和notify(),notifyAll()是什么选择?
  • 什么时候应该使用CompletionService?
  • 有什么优点/缺点和陷阱需要注意?


  • 为什么在同步集合上使用并发集合?
  • 因为synchronized收集只保护数据免受并发访问造成的损坏。 这并不意味着synchronized集合已针对并发访问进行了优化。 事实上 - 一个ConcurrentMap.putIfAbsent是一个比compareAndSet更好的机制,而不是锁定整个Map来读取。

  • 原子类何时应该优于显式锁定?
  • AtomicIntegerAtomicLong类应该始终用于(在我看来)用原始手工锁定,因为它们更简洁。 考虑:

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

    与以下相比:

    int old = counter.getAndIncrement();
    

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

  • Locks何时应该用于同步?
  • 这是一个更复杂的问题,因为Locks使用会带来一些开销。 事实上,人们经常说在典型情况下使用ReadWriteLock没有任何缺点。 一种必须使用锁的场景是资源的锁定和解锁不能在同一个词法范围内完成。 synchronized是无力帮助在这些情况下。

  • wait()和notify(),notifyAll()是什么选择?
  • awaitsignalsignal signalAll

  • 什么时候应该使用CompletionService?
  • 完成服务对于计算结果的消耗在提交计算时不需要访问的情况是有用的,但是重要的是完成计算(或其结果或成功)是由您的程序知道。 例如,这可能是监视失败任务(抛出异常)的比例,或者可能是资源清理。


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

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

    200KLOC代码库在这里是多线程的。 我们正在向无数核心传播负载,并拥有生产者/消费者计划等军队。

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

    零。

    我重新强调它是一个严重的多线程应用程序:锁存器,毒药片,java.util.concurrent。**以及任何地方。 但wait(),notify()或notifyAll():零实例。

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

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

    “如果有一个库可以让你免于进行低级别的多线程编程,尽可以使用它。”

    链接地址: http://www.djcxy.com/p/76247.html

    上一篇: Use cases for Java concurrent utilities

    下一篇: Allowing a method to lock its parent Object in Java