本文转载自微信公众号《运维开发故事》,作者老郑。转载本文请联系运维开发故事公众号。概述Semaphore信号量,信号量维护着一组权限。如有必要,每个采集模块都会阻塞,直到获得许可为止。然后拿到驾照。每个版本都会添加一个许可证,可能会释放被阻止的资源。但是,没有使用实际的权限对象;计算可用信号量的数量,并执行操作。信号量通常可用于限制访问某些(物理或逻辑)资源的线程数。例如,下面是一个使用信号量来控制对线程池的访问。classPool{privatestaticfinalintMAX_AVAILABLE=100;privatefinalSemaphoreavailable=newSemaphore(MAX_AVAILABLE,true);publicObjectgetItem()throwsInterruptedException{available.acquire();returngetNextAvailableItem();}publicvoidputItem(Objectx){if(mark}AsUnusable)//不是特别高效的数据结构;justfordemoprotectedObject[]items=...whateverkindsoitemsbeingmanagedprotectedboolean[]used=newboolean[MAX_AVAILABLE];protectedsynchronizedObjectgetNextAvailableItem(){for(inti=0;i{try{Migratormigrator=newMigrator();迁移器。setName("name-"+idx);semaphore.acquire();TimeUnit.SECONDS.sleep(1);migrator.gapBridge();System.out.println("name"+migrator.getName()+"pass");}catch(InterruptedExceptione){e.printStackTrace();}finally{semaphore.release();}}).start();}}}输出日志如下:可以看到有5个线程得到了“Permits”几乎同时过桥,然后逐渐释放一个许可,另一个线程继续执行。迁移器:name-7,时间:1630495912011namename-7通过迁移器:name-2,时间:1630495912011namename-2通过迁移器:name-4,时间:1630495912011Migrator:name-8,时间:1630495912011Migrator:name-3,时间:16304959312011name通过namename-8通过namename-4通过Migrator:name-5,time:1630495913012namename-5通过Migrator:name-0,time:1630495913012namename-0通过Migrator:name-6,time:1630495913013参考文档https://www。cnblogs.com/leesf456/p/5414778.html