Semaphore
是 Java 并发包中的一种同步工具,它主要用于控制同时访问特定资源或执行特定操作的线程数量。以下是 Semaphore
的主要作用和特点:
-
控制并发线程数量:
Semaphore
可以限制同时访问某一资源或执行某一操作的线程数量,通过设置信号量的计数器来实现控制。 -
资源池的控制: 可以用于实现对象池、连接池等场景,限制池中资源的并发访问数量。
-
保护共享资源: 可以保护共享资源不被多个线程同时访问,从而避免竞态条件和数据不一致性问题。
-
实现互斥访问: 类似于锁的功能,但比锁更灵活,可以控制多个线程同时访问某个资源的数量。
-
实现公平性:
Semaphore
可以选择是否公平地分配许可,即先请求许可的线程将获得许可的优先权。
在使用 Semaphore
时,主要涉及到两个核心方法:
acquire()
:请求一个许可,如果没有许可可用,则阻塞直到有许可可用。release()
:释放一个许可,使其可供其他线程使用。
通过初始化 Semaphore
实例时设定的许可数量,可以控制同时允许多少个线程执行关键代码段或访问关键资源。当许可数量为 1 时,Semaphore
的行为类似于互斥锁(Mutex),允许只有一个线程访问临界区;当许可数量大于 1 时,多个线程可以同时访问临界区,但受许可数量的限制。
下面举一个关于停车场的例子,当有车离开时,会有另一辆车抢到位置
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(2);
for (int i = 0; i < 10; i++) {
Thread t = new Thread(() -> {
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " : 抢到位置");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
semaphore.release();
System.out.println(Thread.currentThread().getName() + " : 离开位置");
});
t.start();
}
}
}
感谢您的阅读!有任何疑问,欢迎联系我
714321862@qq.com