JUC并发编程 共享模式之工具 JUC Semaphore(信号量) -- 介绍 & 使用
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC并发编程 共享模式之工具 JUC Semaphore(信号量) -- 介绍 & 使用相关的知识,希望对你有一定的参考价值。
1. Semaphore
1.1 介绍
信号量,用来限制能同时访问共享资源的线程上限。作用类似于停车场里面的信号指示牌: 显示还有多少空车位。
1.2 使用
1.2.1 不使用 Semaphore
package com.tian;
import lombok.extern.slf4j.Slf4j;
@Slf4j(topic = "c.TestSemaphore")
public class TestSemaphore {
public static void main(String[] args) {
// 2. 10个线程同时运行
for (int i = 0; i < 10; i++) {
new Thread(() -> {
log.debug("start....");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("end....");
}, "thread_0" + i).start();
}
}
}
运行结果:
1.2.2 使用 Semaphore
package com.tian;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Semaphore;
@Slf4j(topic = "c.TestSemaphore")
public class TestSemaphore {
public static void main(String[] args) {
// 1. 创建 semaphore 对象
// 表示最多可以同时运行3个线程 ,第二个参数是一个布尔值 ture表示为公平锁否则为非公平锁
Semaphore semaphore = new Semaphore(3);
// 2. 10个线程同时运行
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
// 获得许可
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
log.debug("running...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("end...");
} finally {
// 释放许可
semaphore.release();
}
}).start();
}
}
}
运行结果:
1.2.3 结论
结果不言而喻,Semaphore 可以限制线程同时运行的个数。
以上是关于JUC并发编程 共享模式之工具 JUC Semaphore(信号量) -- 介绍 & 使用的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 JUC Semaphore(信号量) -- 介绍 & 使用
JUC并发编程 共享模式之工具 JUC ConcurrentHashMap -- ConcurrentHashMap的错误使用和正确使用(示例:统计单词个数)
JUC并发编程 共享模式之工具 JUC Semaphore(信号量) -- Semaphore原理
JUC并发编程 共享模式之工具 JUC 线程安全的集合类 -- 线程安全的集合类概述
JUC并发编程 共享模式之工具 ThreadPoolExecutor -- 正确处理线程池异常
JUC并发编程 共享模式之工具 JUC 读写锁 ReentrantReadWriteLock -- ReentrantReadWriteLock(不可重入锁)使用 & 注意事项