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(不可重入锁)使用 & 注意事项