目录
- Semaphore
- 例子代码和输出
- semaphore.acquire();
- semaphore.release();
Semaphore
semaphore :
英[ˈseməfɔː(r)] 美[ˈseməfɔːr]
n. 旗语; 信号标;
v. 打旗语; (用其他类似的信号系统)发信号;
[例句]Semaphore was widely used at sea, before the advent of electricity.
在电问世以前,旗语在海上运用广泛。
[其他] 第三人称单数:semaphores 复数:semaphores 现在分词:semaphoring 过去式:semaphored 过去分词:semaphored
例子代码和输出
public class Test {
final static int CNT = 2;
static Semaphore semaphore = new Semaphore(CNT);
public static void main(String[] args) throws InterruptedException {
Runnable runnable = () -> {
try {
semaphore.acquire();
// 业务处理
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName() + ":" + " finished");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() + ":" + " release");
semaphore.release();
}
};
List<Thread> threads = new ArrayList<>(4);
for(int i= 0;i<6;i++) {
Thread thread = new Thread(runnable);
threads.add(thread);
}
for(Thread thread: threads){
thread.start();
}
}
}
输入如下:可以看到同时最多只有2个线程能得到执行
semaphore.acquire();
CAS操作消耗一个信号量;如果没有信号量可消耗了,就死循环等待了
semaphore.release();
semaphore.acquire()的反向操作。
release增加信号量;acquire减少信号量。