一、Semaphore信号量是一种用于管理对共享资源的控制的同步机制。信号量的核心就是一个计数器它表示可用的资源数量。获取当一个线程要访问一个共享资源时他会调用获取操作如果信号量计数器大于0有资源可用信号量就减少计数器的值允许线程访问如果信号量计数器小于0没有资源可用线程就会被阻塞直到计数器大于0.释放当线程完成对资源的访问后就会执行释放的操作信号量会增加计数器的值表示资源可用。如果有其他线程因为请求资源而被阻塞信号量会选择一个或多个线程解除它们的阻塞状态允许它们访问资源。还记得之前在线程安全那里的代码案例嘛我们用Semaphore来实现package Study // 导包 import std.sync.* import std.collection.* var counter 100 // 计数器从1开始 let semaphore Semaphore(1) let list ArrayListFutureUnit() main () { for (_ in 0..100) { let future spawn { // 获取 semaphore.acquire() counter // 释放 semaphore.release() } list.add(future) } for (future in list) { future.get() } println(counter) }在举一个例子有一个停车场停车场入口会显示剩余车位当车进入停车场车位就减1当车离开后车位加1如果停车场车停满了其他车必须等待直到有车离开。package Study // 导包 import std.sync.* import std.collection.* let count 3 class Park { Park(private var semaphore: Semaphore) { this.semaphore semaphore } // 停车 func parkCar() { try { // 获取 semaphore.acquire() println(汽车${Thread.currentThread.id}已停车) // 模拟停车时间 sleep(Duration.second * 5) } catch (_) { println(如果有资源要释放的,需要处理异常) } finally { // 释放 semaphore.release() println(汽车${Thread.currentThread.id}已离开) } } } main () { let park Park(Semaphore(count)) let list ArrayListFutureUnit() for (_ in 0..5) { let future spawn { park.parkCar() } list.add(future) } for (future in list) { future.get() } }在使用Semaphore需要注意以下几点1. 确保每次获取和释放的使用是一致的必须保证每一个获取都要对应一个释放2. 避免死锁确保获取和释放的顺序一致。3. 资源清理确保不在使用的资源被清理避免因为资源占用而导致的异常二、小结本章为大家详细的介绍了仓颉编程语言中多线程协调之Semaphore的内容下一章为大家带来多线程练习题的内容。最后创作不易如果大家觉得我的文章对学习仓颉服务端开发有帮助的话就动动小手点个免费的赞吧收到的赞越多我的创作动力也会越大哦谢谢大家