Java中的Semaphore(信号量)是一种用于控制多个线程对共享资源访问的工具。你可以把它想象成一个计数器,用来记录当前可以访问资源的线程数量。
具体用途
-
资源管理:如果你有一个有限的资源池,比如数据库连接池,线程池,或者一组固定数量的资源,Semaphore可以帮你控制有多少线程可以同时访问这些资源。
-
流量控制:在高并发环境下,你可以使用Semaphore限制同时访问某个服务的线程数量,从而避免系统过载。
工作原理
-
初始化:你在创建Semaphore时,需要指定一个初始的许可数(permits),这个数字表示可以同时访问资源的线程数量。
-
获取许可:当一个线程想要访问资源时,它需要先从Semaphore那里获取一个许可。如果当前有可用的许可,Semaphore会减少一个许可数并允许线程继续执行。如果没有可用的许可,线程会被阻塞,直到有其他线程释放许可。
-
释放许可:当一个线程完成了对资源的访问,它需要释放一个许可,这样其他被阻塞的线程就有机会获取许可并访问资源。
举个例子
假设你和你的朋友们在一个只有两个窗口的餐厅排队买餐。Semaphore就像餐厅的窗口管理系统,它只允许最多两个人同时在窗口前点餐。其他人在等待区排队,只有当一个窗口空出来时,排在前面的人才能上前点餐。
使用步骤
-
创建Semaphore:指定许可数量,比如
Semaphore semaphore = new Semaphore(2);
,表示最多允许两个线程同时访问资源。 -
获取许可:线程在进入关键区域前调用
semaphore.acquire();
,如果许可不够,线程会被阻塞。 -
访问资源:线程在获得许可后,可以访问共享资源。
-
释放许可:访问完资源后,线程调用
semaphore.release();
,释放许可,让其他线程有机会访问资源。