伙计们,任何人都可以提供一个简单实用的例子LockSupport
& AbstractQueuedSynchronizer
使用? javadocs中给出的示例非常紧张。
我理解Semaphore
许可证的使用情况。
感谢您的回复。
答案 0 :(得分:15)
如果您正在谈论使用锁定机制(甚至是同步障碍),请使用java.util.concurrent.Lock
。显而易见的建议是使用ReentrantLock
用户委派给Synch
。同步是AQS,而AQS又使用LockSupport
。
这一切都是为你完成的。
编辑:
不要让我们回顾一下AbstractQueuedSynchronizer
(AQS)的实际用途。
虽然并发结构的用法可能非常不同,但它们可以具有相同的底层函数。
即。在某些条件下停放此线程。在某些其他情况下唤醒一个线程。
这是一组非常广泛的指令,但很明显大多数并发结构需要一些能够为它们处理这些操作的通用功能。输入AQS。有五个主要的同步障碍。
ReentrantLock
ReadLock
WriteLock
Semaphore
CountDownLatch
现在,使用它们时,所有这五种结构都有完全不同的规则。 CountdownLatch
可以允许多个线程同时运行,但强制一个(或多个)线程等待,直到所述锁存器上至少有n个线程倒计时。
ReentrantLock
一次只强制一个线程进入一个关键部分,并将所有其他线程排队等待它完成。
ReadLock
允许任意数量的读取线程进入临界区,直到获得写锁定为止。
这些例子可以继续,但这里的大局是他们都使用AQS。这是因为它们能够使用AQS提供的原始函数,并在其上实现更复杂的功能。 AQS允许你停放unpark并唤醒线程(如果需要可以中断),但这样你可以支持许多复杂的功能。
答案 1 :(得分:1)
它们不适合直接用于客户端代码;更多的是帮助构建新的并发类。
答案 2 :(得分:1)
AQS是一个用于构建并发原语的精彩类 - 但它很复杂,需要一些研究才能正确使用它。我已将它用于lazy initialisation和简单快速reusable latch等一些内容。
虽然很复杂,但我认为AQS并不特别模糊,它有很好的javadoc描述如何正确使用它。
答案 3 :(得分:1)
2.7 Disruptor版本使用LockSupport.parkNanos而不是Thread.sleep来减少延迟:
答案 4 :(得分:0)
AFAIK,AbstractQueuedSynchronizer用于管理状态转换。 JDK使用它来扩展Sync,这是java.util.concurrent.FutureTask的内部类。 Sync类管理FutureTask的状态(READY,RUNNING,RAN和CANCELED)以及它们之间的转换。
正如您所知,这允许FutureTask在FutureTask.get()上阻塞,直到达到RAN状态为止。