自建网站访问报错,网站建设中怎么编辑图片,网站维护是什么专业,网站建站方式有哪些文章目录 一、概述二、使用方法三、测试示例 一、概述 Semaphore#xff08;信号量#xff09;是一种并发控制机制#xff0c;用于控制对共享资源的访问。它维护了一个计数器#xff0c;可以限制同时访问某个资源的线程数量。常用于限制同时访问某个资源的线程数量#xf… 文章目录 一、概述二、使用方法三、测试示例 一、概述 Semaphore信号量是一种并发控制机制用于控制对共享资源的访问。它维护了一个计数器可以限制同时访问某个资源的线程数量。常用于限制同时访问某个资源的线程数量例如控制数据库连接池的并发访问、控制线程池的并发任务数、生产者-消费者问题、读者-写者问题等。 使用 Semaphore 就像银行取钱一样。假如银行有3个柜台那么同一时刻最多就只能有3个人取钱其他人需在等待区等待。当其中某个柜台的人走了以后等待区的人才能有一个人到柜台办理取钱业务。从而实现限流保证了柜台业务的正常运作否则都挤过去就乱了。 Semaphore 有两个主要操作acquire() 和 release()。 acquire(): 当一个线程需要访问共享资源时它可以调用 acquire() 方法。如果计数器大于0那么线程将获得访问权限并将计数器减1。如果计数器为0那么线程将被阻塞直到有其他线程释放资源并增加计数器。release(): 当一个线程完成对共享资源的访问时它应该调用 release() 方法来释放资源并增加计数器的值。这将允许其他线程获取访问权限。tryAcquire()尝试获取一个许可证如果获取成功返回 true否则返回 false不会阻塞线程。 注意Semaphore 通常用来限流即限制访问某个资源的线程数。而不是用于斥锁资源的访问如果要用于斥锁资源的问题则需把初始计数器设置为1。这时它变成了一个二元信号量通常被称为互斥锁。只允许一个线程同时访问共享资源。
二、使用方法 使用 Semaphore 的方法如下 声明一个 Semaphore 对象初始化时指定 同时访问资源 的线程个数。在业务开始部分使用 semaphore.acquire(); 领取许可证。完成业务后使用 semaphore.release(); 还回许可证。 public class SemaphoreExample {private Semaphore semaphore new Semaphore(5); // 允许同时访问资源的线程数量这里设置为5表示可以有5个线程同时访问public void accessResource() {try {semaphore.acquire(); // 获取许可证如果有许可证则计数器减1如果没有可用许可证则阻塞// 访问共享资源的代码} catch (InterruptedException e) {// 处理中断异常} finally {semaphore.release(); // 释放资源计数器加1}}
}三、测试示例 在下面示例中创建了一个 BankSemaphoreExample 类模拟银行有5个柜台可以进行取钱业务。在主线程中创建100个线程模拟100个富豪然后一起去银行取钱。由于银行使用 Semaphore 限流同一时刻只能有5个人取钱其他人会排队等候。 package top.yiqifu.study.p004_thread;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;public class Test086_Semaphore {public static void main(String[] args) {BankSemaphoreExample bank new BankSemaphoreExample();ListThread threads new ArrayList();for(int i 1; i 100; i){Thread t new Thread(()-{try {bank.getMoney(Thread.currentThread().getName());Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});t.setName(富豪i);threads.add(t);}for(Thread t : threads){t.start();}for(Thread t : threads){try {t.join();} catch (InterruptedException e) {e.printStackTrace();}}}public static class BankSemaphoreExample {private volatile float Money 1000 * 10000;private Semaphore semaphore new Semaphore(5); // 假高银行有5个柜台synchronized void get(float m) {this.Money - m;}public void getMoney(String people){try {semaphore.acquire();float m (float) Math.random()* 10000;this.get(m);System.out.println(people 取钱m元还有排队富豪semaphore.getQueueLength());Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}}}
}