java之SQA一

        1.AQS:抽象的队列式的同步器;AQS定义了一套多线程访问共享资源的同步器框架.

        2.AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效 的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,将暂时获取不到锁的线程加入到队列中。

        3.AQS 定义两种资源共享方式:

                1)Exclusive(独占)

                公平锁:按照线程在队列中的排队顺序,先到者先拿到锁

                非公平锁:当线程要获取锁时,先通过两次 CAS 操作去抢锁,如果没抢到,当前线程再加入到队列中等待唤醒。

                不同:

                        非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢锁,如果这个时候恰 巧锁没有被占用,那么直接就获取到锁返回了。

                        非公平锁在 CAS 失败后,和公平锁一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现锁这个时候被释放,非公平锁会直接 CAS 抢锁,但是公平锁会判断等待队列是否有线程处于等待状态,如果有则不去抢锁,乖乖排到后面。

                        公平锁会有更好的性能,它的吞吐量比较大。非公平锁让获取锁的时间变得更加不确定,可能会导致在阻塞队列中的线程长期处于饥饿状态。

        4.AQS 底层使用了模板方法模式

         使用者继承 AbstractQueuedSynchronizer 并重写指定的方法。(这些重写方法很 简单,无非是对于共享资源 state 的获取和释放)

        将 AQS 组合在自定义同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。

        5.A 线程 lock()时,A 线程自己是可以重复获取此锁的(state 会累加),这就是可重入的概念。注意,获取多少次就要释放多么次,这样才能保证 state 是能回到零态的。

        6.synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。

        7..Semaphore(信号量)执行 acquire 方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个 release 方法增加一个许可证,这可能会释放一个阻塞的 acquire 方法。然而,其实并没有实际的许可证这个对象,Semaphore 只是维持了一个可获得许可证的数量。 Semaphore 经常用于限制获取某种资源的线程数量。当然一次也可以一次拿取和释放多个许可,不过一般没有必要这样做

        8.Semaphore 有两种模式,公平模式和非公平模式。

                公平模式: 调用 acquire 的顺序就是获取许可证的顺序,遵循 FIFO;

                非公平模式: 抢占式的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值