首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发中的AbstractQueuedSynchronizer

Java并发中的AbstractQueuedSynchronizer
EN

Stack Overflow用户
提问于 2012-03-10 07:52:03
回答 3查看 6.3K关注 0票数 10

AbstractQueuedSynchronizer在Java的concurrent.locks包中是用来做什么的?有人能说明一下它的方法doAcquireInterruptiblyparkAndCheckInterrupt吗?

EN

回答 3

Stack Overflow用户

发布于 2012-03-10 08:49:19

AbstractQueuedSynchronizer在concurrent.locks包中的用途是什么

AbstractQueuedSynchronizer是在java.util.concurrency包中使用和实现(至少)的同步构造的构建块。

例如,ReentrantLock将委托给扩展AbstractQueuedSynchronizer的同步。如果你要写你自己的锁,它可能是这样的

代码语言:javascript
复制
public class MyLock extends AbstractQueuedSynchronizer implements Lock{
    @Override
    public void lock() {
        super.acquire(1);
    }
    @Override
    public void unlock() {
        if(Thread.currentThread() != super.getExclusiveOwnerThread())
            throw new IllegalMonitorStateException();
        super.release(1);
    }
}

因此,在这里,MyLock类将继承线程挂起的低级功能&排队到AQS,同时处理任何特殊的功能本身(例如,这个锁要求拥有锁的线程是释放锁的线程,而信号量不需要)。

可以让人对它的方法doAcquireInterruptibly和parkAndCheckInterrupt有所了解

注意:这些方法对类是私有的,因此实际的功能可以在不同版本或不同实现之间进行更改。我现在解释的默认功能如下:

doAcquireInterruptibly将尝试成为此同步的独占所有者。它将永远这样做,直到线程被中断或成功获取为止。考虑一个试图进入synchronized块的线程,线程将永远呆在那里,直到它进入监视器(当前没有线程拥有或拥有的线程存在监视器)。这里的优点是获取线程可以被中断。

parkAndCheckInterrupt只是一个方便的方法,它将挂起(停放)一个线程,在重置中断状态的同时返回。

票数 11
EN

Stack Overflow用户

发布于 2012-10-24 04:59:13

  • AbstractQueuedSynchronizer:提供了一个实现阻塞锁和相关同步器(如信号量、CountDownLatch等)的框架。获取的基本算法是尝试获取,如果成功返回其他队列线程,如果它尚未排队,则阻塞当前线程。类似地,发布的基本算法是尝试释放,如果成功,则解除阻塞队列中的第一个线程,否则只需返回。线程将在先进先出(FIFO)等待队列中等待.抽象方法tryAcquire和tryRelease将通过子类实现,基于它们的tryAcquire和tryRelease将尝试获取锁。如果锁已被其他线程获取,则当前线程将被阻塞(停放)。如果它获得了锁,它将简单地return.
  • parkAndCheckInterrupt将停止线程,或者换句话说,禁用线程调度,直到其他线程解除阻塞。这可能是由于拥有的线程释放了锁,也可能是由于其他线程中断了锁。如果被其他线程中断,则会引发异常。
票数 9
EN

Stack Overflow用户

发布于 2013-12-11 08:23:39

我想用一些简单的话谈谈AbstractQueuedSynchronizer(AQS)。

想一想现实世界中的这些情景:

  • 对于游泳者来说,他们可以一起在游泳池里游泳(共享)。但是对于清洁工来说,他必须等到所有的游泳者都有gone(exclusive).的时候,才能用氯气来净化它。
  • 对于在繁忙停车场外的司机来说,他们必须排队等候。通常是看门人控制出入。一辆普通汽车将占用one停车位。林肯豪华轿车可以乘坐more.

2或2

正如我们所看到的,有三个变量:

  1. 资源总量。
  2. 每次占用多少资源。strategy(shared/exclusive).

  • Access

AQS是一个模板类,用于管理关键部分,这意味着您可以对其进行扩展,并使用上面的变量来完成您的工作。如何避免竞争风险或控制队列等详细信息已被隐藏。

要进一步阅读,您最好了解Mutex、Semaphore和ReentrantReadWriteLock的源代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9644856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档