LockSupport和AbstractQueuedSynchronizer的任何实际例子都使用?

伙计们,任何人都可以提供一个简单的LockSupportAbstractQueuedSynchronizer实用例子吗? javadocs中给出的示例非常紧张。

我理解使用Semaphore许可证。

谢谢你的回复。

如果你在谈论使用锁定机制(甚至同步障碍),只需使用java.util.concurrent.Lock 。 显而易见的建议是使用ReentrantLock委托给Synch 。 同步是AQS,后者又使用LockSupport

这一切都是为你完成的。

编辑:

不,让我们回顾一下AbstractQueuedSynchronizer (AQS)的实际用途。

虽然并发结构的用法可能非常不同,但它们可以具有相同的底层函数。

即在某种情况下停放此线程。 在某些其他情况下唤醒线程。

这是一组非常广泛的指令,但很明显大多数并发结构需要一些能够为它们处理这些操作的通用function。 输入AQS。 有五个主要的同步障碍。

  • ReentrantLock
  • ReadLock
  • WriteLock
  • Semaphore
  • CountDownLatch

现在,所有这五种结构在使用时都有非常不同的规则。 CountdownLatch可以允许许multithreading同时运行,但强制一个(或多个)线程等待,直到所述锁存器上至少n个线程倒计数。

ReentrantLock只强制一个线程进入一个关键部分,并将所有其他线程排队等待它完成。

ReadLock允许任意数量的读取线程进入临界区,直到获得写锁定为止。

这些例子可以继续,但这里的大图是他们都使用AQS。 这是因为他们能够使用AQS提供的原始函数,并在其上实现更复杂的function。 AQS允许您停放unpark并唤醒线程(如果需要可以中断),但这样可以支持许多复杂的function。

它们不适合直接用于客户端代码; 更多用于帮助构建新的并发类。

AQS是一个用于构建并发原语的精彩类 – 但它很复杂,需要一些研究才能正确使用它。 我已经将它用于一些事情,如延迟初始化和简单快速可重复使用的锁存器 。

虽然它很复杂,但我认为AQS并不特别模糊,它有很好的javadoc描述如何正确使用它。

2.7 Disruptor版本使用LockSupport.parkNanos而不是Thread.sleep来减少延迟:

http://code.google.com/p/disruptor/

AFAIK,AbstractQueuedSynchronizer用于管理状态转换。 JDK使用它来扩展Sync,这是java.util.concurrent.FutureTask的内部类。 Sync类管理FutureTask的状态(READY,RUNNING,RAN和CANCELED)以及它们之间的转换。

正如您所知,这允许FutureTask在FutureTask.get()上阻塞,直到达到RAN状态为止。