ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

信号量semaphore

2021-06-21 13:33:22  阅读:190  来源: 互联网

标签:semaphore Thread ReentrantLock 信号量 线程 Semaphore


Semaphore 是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信
号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore 可以用来
构建一些对象池,资源池之类的,比如数据库连接池
实现互斥锁(计数器为 1)
我们也可以创建计数为 1 的 Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,
表示两种互斥状态。

@Slf4j
public class SemapOhoreDemo {

    public static void main(String[] args) throws InterruptedException {

        //创建一个计数阈值为5的信号量对象
        //只有5个线程能同时访问
        Semaphore semaphore =new Semaphore(5);

        Thread[] threads =new Thread[10];
        for (int i=0;i<threads.length;i++){
            threads[i]= new Thread(() -> doString(semaphore));
        }

        for (Thread thread : threads) {
            thread.start();
        }
        log.info("任务执行完毕");
    }

    public static int doString(Semaphore semaphore){

        try {
            //申请许可
            semaphore.acquire();
            try {
                Thread.sleep(3000);
                //业务逻辑
                log.info(Thread.currentThread().getName()+"执行业务逻辑"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //释放许可
                semaphore.release();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return semaphore.getQueueLength();
    }
}

Semaphore 与 ReentrantLock
Semaphore 基本能完成 ReentrantLock 的所有工作,使用方法也与之类似,通过 acquire()与
release()方法来获得和释放临界资源。经实测,Semaphone.acquire()方法默认为可响应中断锁,
与 ReentrantLock.lockInterruptibly()作用效果一致,也就是说在等待临界资源的过程中可以被
Thread.interrupt()方法中断。
此外,Semaphore 也实现了可轮询的锁请求与定时锁的功能,除了方法名 tryAcquire 与 tryLock
不同,其使用方法与 ReentrantLock 几乎一致。Semaphore 也提供了公平与非公平锁的机制,也
可在构造函数中进行设定。
Semaphore 的锁释放操作也由手动进行,因此与 ReentrantLock 一样,为避免线程因抛出异常而
无法正常释放锁的情况发生,释放锁的操作也必须在 finally 代码块中完成。

标签:semaphore,Thread,ReentrantLock,信号量,线程,Semaphore
来源: https://blog.csdn.net/qq_34069839/article/details/118084588

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有