如何确保网站标志的设计原则与网站建设功能需求方案的一致性?
摘要:网站标志的原则,网站建设功能需求方案,哪个网站可以代做试题,做网站是用的那个开发软件一、Semaphore Semaphore 通过设置一个固定数值的信号量,并发时线程通过 acquire() 获取一个信号量&
网站标志的原则,网站建设功能需求方案,哪个网站可以代做试题,做网站是用的那个开发软件一、Semaphore
Semaphore 通过设置一个固定数值的信号量#xff0c;并发时线程通过 acquire() 获取一个信号量#xff0c;如果能成功获得则可以继续执行#xff0c;否则将阻塞等待#xff0c;当某个线程使用 release() 释放一个信号量时#xff0c;被阻塞的线程则可以被唤…一、Semaphore
Semaphore 通过设置一个固定数值的信号量并发时线程通过 acquire() 获取一个信号量如果能成功获得则可以继续执行否则将阻塞等待当某个线程使用 release() 释放一个信号量时被阻塞的线程则可以被唤醒重新争抢信号量。根据该特征可以有效控制线程的并发数。
那 Semaphore 是如何控制并发的呢本篇文章带领大家一起解读下 Semaphore 的源码。
在进行源码分析前先回顾下 Semaphore 是如何使用的例如下面一个案例
public class Test {public static void main(String[] args) {Semaphore semaphore new Semaphore(3);for (int i 0; i 10; i) {new Thread(() - {try {semaphore.acquire();System.out.println(线程 Thread.currentThread().getName() 执行, 当前时间 LocalDateTime.now().toString());Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();} finally {semaphore.release();}}, String.valueOf(i)).start();}}
}运行之后可以看到下面日志 可以看到每次都是 3 个并发。
在本专栏前面讲解 AQS 源码的时候提到 Semaphore 是基于 AQS 实现的那是如何使用的 AQS 呢
在 AQS 中如果需要使用AQS的特征则需要子类根据使用的场景重写下面方法
//查询是否正在独占资源condition会使用
boolean isHeldExclusively()
//独占模式尝试获取资源成功则返回true失败则返回false
boolean tryAcquire(int arg)
//独占模式尝试释放资源成功则返回true失败则返回false
boolean tryRelease(int arg)
//共享模式尝试获取资源如果返回负数表示失败否则表示成功。
int tryAcquireShared(int arg)
//共享模式尝试释放资源成功则返回true失败则返回false。
boolean tryReleaseShared(int arg)由于这里 Semaphore 的特性所以下面我们只需关注共享模式下的几个方法即可。
说明由于 Semaphore 的实现依赖于 AQS 因此需要对 AQS 有一定的了解不了解的小伙伴可以看下这篇对 AQS 源码分析的文章和当前文章在同一专栏 https://blog.csdn.net/qq_43692950/article/details/129367736 二、Semaphore 中 Sync、FairSync、NonfairSync
2.1 Sync、FairSync、NonfairSync
在声明 Semaphore 时有两种方式一种是使用只有一个 permits 参数的构造函数一种则需要多增加一个 fair 参数
new Semaphore(3);
new Semaphore(3, true);当使用只有一个 permits 参数的构造函数声明时则是创建了一个 NonfairSync 对象 通过需要多增加一个 fair 参数的构造函数时则可以根据传入的 fair 选择创建一个 FairSync 对象 这里也不难理解 NonfairSync 和 FairSync 其实可以理解为 Semaphore 中的非公平锁和公平锁两种类型。
点到这两个类中可以看到都继承自 Sync 类 而 Sync 类则继承自 AQS 到这里我们就可以寻找几个关键的方法在AQS中共享模式下两大关键的方法是交由子类进行实现的分别是 tryAcquireShared 尝试获取资源和 tryReleaseShared 尝试释放资源。
