并发之Semaphore

Semaphore,谓之信号量。信号量主要作用是允许多个线程同时访问某个资源。
构造函数如下:

public Semaphore(int permits) {
        sync = new NonfairSync(permits);
    }
public Semaphore(int permits, boolean fair) {
        sync = fair ? new FairSync(permits) : new NonfairSync(permits);
    }

和重入锁一样,信号量也支持公平FairSync和非公平锁NonfairSync,也同样继承了内部类Sync,Sync也继承了AQS,之所以说AQS是JUC里的关键组件了。
信号量的使用简单,首先拿到固定数量的许可,也即声明一个对象(new Semaphore(5)),之后,基本就是通过acquire()(获取)和release()(释放)两个方法共享这个变量了。当然,和重入锁一样,信号量也提供了tryAcquire()方法,让线程在暂时拿不到许可的情况下先执行其他任务。
使用示例:

public class SemaphoreTest {
    //停车场车位
    static final class ParkCount {
        Random random = new Random();
        private Semaphore semaphore;

        public ParkCount(int count) {
            semaphore = new Semaphore(5);
        }

        //停车
        public void park(String carName) {
            try {
                semaphore.acquire();//获取锁
                int parktime = random.nextInt(10);
                System.out.println(carName + " 停车 " + parktime + "秒");
                Thread.sleep(parktime * 1000);
                semaphore.release();//释放锁
                System.out.println(carName + " 离开");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //车
    static final class Car implements Runnable {
        ParkCount parkCount;
        String carName;

        public Car(ParkCount parkCount, String carName) {
            this.parkCount = parkCount;
            this.carName = carName;
        }

        @Override
        public void run() {
            parkCount.park(carName);
        }
    }

    public static void main(String[] args) {
        ParkCount parkCount = new ParkCount(10);
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 20; i++) {
            executorService.submit(new Car(parkCount,"Car"+i));
        }
    }

}

运行结果如下:


结果
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容