来限制对资源访问的线程的上限;好比洗浴店里面的手牌,比如你进去一个洗浴店里,服务生首先会给
你一个手牌;如果手牌没有了你则需要去喝茶等待;等他其他问洗完你才可以去享受服务;手牌相当于
你一个许可;你去享受服务的时候先要获取手牌,服务完成之后需要归还手牌;
基本语法
//线程的上限
Semaphore semaphore = new Semaphore(3);
//获取一个许可 -
semaphore.acquire();
//释放 +
semaphore.release();
代码示例
import lombok.extern.slf4j.Slf4j; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; /** * 来限制对资源访问的线程上线 */ @Slf4j public class SemaphoreTest { public static void main(String[] args) { //每次访问的线程上限是3 Semaphore semaphore = new Semaphore(3); for (int i = 0; i < 15; i++) { new Thread(() -> { try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } try { log.debug("start..."); TimeUnit.SECONDS.sleep(1); log.debug("end..."); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } }).start(); } } }
注意只能限制手牌上限,就是客人的数量,你架不住有的技师今天心情不好不想工作;所以可能店里有
100个技师;但是只有60个手牌也就是只能最多服务60个客人;
samephore原理分析