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方法释放许可供其他线程使用,之前被阻塞的线程会被唤醒继续执行。

Last modification:December 15, 2022
如果觉得我的文章对你有用,请随意赞赏