emaphore
Semaphore是用来控制特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源
semaphore一般用于流量的控制,特别是公共资源有限的应用场景.例如数据库连接,假设数据库的链接数上线为10个,多线程并发按操作数据库可以使用semaphore来控制并发操作数据库的线程个数,最多为10个
总览
通过上面的类图可以看到,Semaphore与ReentrantLock的内部类的结构相同,类内部总共存在Sync、NonfairSync、FairSync三个类,NonfairSync与FairSync类继承自Sync类,Sync类继承自AbstractQueuedSynchronizer抽象类。public class Semaphore implements java.io.Serializable {}
案例
package duoxiancheng;
import java.util.concurrent.Semaphore;
/**
* @Author: tongck
* @Date: 2022/9/6 16:42
*/
public class Test1 {
public static void main(String[] args) {
//定义semaphore实例,设置许可数为3,即停车位为3个
Semaphore semaphore = new Semaphore(3);
//创建五个线程,即有5辆汽车准备进入停车场停车
for (int i = 1; i <= 5; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "尝试进入停车场...");
//尝试获取许可
semaphore.acquire();
//模拟停车
long time = (long) (Math.random() * 10 + 1);
System.out.println(Thread.currentThread().getName() + "进入了停车场,停车" + time +
"秒...");
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() + "开始驶离停车场...");
//释放许可
semaphore.release();
System.out.println(Thread.currentThread().getName() + "离开了停车场!");
}
}, i + "号汽车").start();
}
}
}
总结,每个线程调用acquire方法尝试获取许可,如果成功就会继续执行,否则就会被阻塞,当获取许可成功后,调用release方法释放许可供其他线程使用,之前被阻塞的线程会被唤醒继续执行。emaphore
Semaphore是用来控制特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源
semaphore一般用于流量的控制,特别是公共资源有限的应用场景.例如数据库连接,假设数据库的链接数上线为10个,多线程并发按操作数据库可以使用semaphore来控制并发操作数据库的线程个数,最多为10个
总览
通过上面的类图可以看到,Semaphore与ReentrantLock的内部类的结构相同,类内部总共存在Sync、NonfairSync、FairSync三个类,NonfairSync与FairSync类继承自Sync类,Sync类继承自AbstractQueuedSynchronizer抽象类。public class Semaphore implements java.io.Serializable {}
案例
package duoxiancheng;
import java.util.concurrent.Semaphore;
/**
* @Author: tongck
* @Date: 2022/9/6 16:42
*/
public class Test1 {
public static void main(String[] args) {
//定义semaphore实例,设置许可数为3,即停车位为3个
Semaphore semaphore = new Semaphore(3);
//创建五个线程,即有5辆汽车准备进入停车场停车
for (int i = 1; i <= 5; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "尝试进入停车场...");
//尝试获取许可
semaphore.acquire();
//模拟停车
long time = (long) (Math.random() * 10 + 1);
System.out.println(Thread.currentThread().getName() + "进入了停车场,停车" + time +
"秒...");
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() + "开始驶离停车场...");
//释放许可
semaphore.release();
System.out.println(Thread.currentThread().getName() + "离开了停车场!");
}
}, i + "号汽车").start();
}
}
}
总结,每个线程调用acquire方法尝试获取许可,如果成功就会继续执行,否则就会被阻塞,当获取许可成功后,调用release方法释放许可供其他线程使用,之前被阻塞的线程会被唤醒继续执行。