用于Java并发实用程序的用例
我已经阅读过Java Concurrency in Practice,这是一个很好的参考,但我希望看到java.util.concurrent包用例的简单单页摘要。
例如:
有什么优点/缺点和陷阱需要注意?
因为synchronized
收集只保护数据免受并发访问造成的损坏。 这并不意味着synchronized
集合已针对并发访问进行了优化。 事实上 - 一个ConcurrentMap.putIfAbsent
是一个比compareAndSet
更好的机制,而不是锁定整个Map
来读取。
AtomicInteger
和AtomicLong
类应该始终用于(在我看来)用原始手工锁定,因为它们更简洁。 考虑:
synchronized (lock) {
int old = counter;
counter++;
return old;
}
与以下相比:
int old = counter.getAndIncrement();
不过,我不得不说,这些课程因缺乏等待性而受苦。 例如,您经常需要一些同步布尔值,您在布尔条件上wait
。 这些在旧的Doug Lea并发库中可用作WaitableBoolean
,但它们在juc
中抛弃,我不知道为什么。
这是一个更复杂的问题,因为Locks
使用会带来一些开销。 事实上,人们经常说在典型情况下使用ReadWriteLock
没有任何缺点。 一种必须使用锁的场景是资源的锁定和解锁不能在同一个词法范围内完成。 synchronized
是无力帮助在这些情况下。
await
, signal
和signal
signalAll
完成服务对于计算结果的消耗在提交计算时不需要访问的情况是有用的,但是重要的是完成计算(或其结果或成功)是由您的程序知道。 例如,这可能是监视失败任务(抛出异常)的比例,或者可能是资源清理。
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