阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Semaphore

30次阅读
没有评论

共计 762 个字符,预计需要花费 2 分钟才能阅读完成。

前面我们讲了各种锁的实现,本质上锁的目的是保护一种受限资源,保证同一时刻只有一个线程能访问(ReentrantLock),或者只有一个线程能写入(ReadWriteLock)。

还有一种受限资源,它需要保证同一时刻最多有 N 个线程能访问,比如同一时刻最多创建 100 个数据库连接,最多允许 10 个用户下载等。

这种限制数量的锁,如果用 Lock 数组来实现,就太麻烦了。

这种情况就可以使用Semaphore,例如,最多允许 3 个线程同时访问:

public class AccessLimitControl {// 任意时刻仅允许最多 3 个线程获取许可:
    final Semaphore semaphore = new Semaphore(3);

    public String access() throws Exception {// 如果超过了许可数量, 其他线程将在此等待:
        semaphore.acquire();
        try {// TODO:
            return UUID.randomUUID().toString();
        } finally {semaphore.release();
        }
    }
}

使用 Semaphore 先调用 acquire() 获取,然后通过 try ... finally 保证在 finally 中释放。

调用 acquire() 可能会进入等待,直到满足条件为止。也可以使用 tryAcquire() 指定等待时间:

if (semaphore.tryAcquire(3, TimeUnit.SECONDS)) {// 指定等待时间 3 秒内获取到许可:
    try {// TODO:
    } finally {semaphore.release();
    }
}

Semaphore本质上就是一个信号计数器,用于限制同一时间的最大访问数量。

小结

如果要对某一受限资源进行限流访问,可以使用Semaphore,保证同一时间最多 N 个线程访问受限资源。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计762字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中