LockSupport和AbstractQueuedSynchronizer的任何实际例子都使用?
伙计们,任何人都可以提供一个简单的LockSupport
和AbstractQueuedSynchronizer
实用例子吗? 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来减少延迟:
AFAIK,AbstractQueuedSynchronizer用于管理状态转换。 JDK使用它来扩展Sync,这是java.util.concurrent.FutureTask的内部类。 Sync类管理FutureTask的状态(READY,RUNNING,RAN和CANCELED)以及它们之间的转换。
正如您所知,这允许FutureTask在FutureTask.get()上阻塞,直到达到RAN状态为止。
- 使用ServerSocket和HTML Client上传文件。 陷入InputStream.read()
- 获取证书并将其添加到Java信任库,只有https URL?
- 当从Java应用程序连接到Spark Standalone时,为什么抛出“无法调用已停止的SparkContext上的方法”?
- LibUsb声称接口访问被拒绝Java
- Shell排序Java示例
- 第一次Java循环运行时,为什么?
- HTTP状态500 – 未找到提供程序org.glassfish.json.JsonProviderImpl
- 当我覆盖equals()方法时,为什么要覆盖hashCode()?
- Javainheritance – 此关键字