当前位置:网站首页>Semaphore源码分析

Semaphore源码分析

2020-12-08 11:08:43 雷锅

1.Semaphore使用示例

Semaphore semaphore = new Semaphore(2);

new Thread(() -> {
    try {
        semaphore.acquire();
        Thread.sleep(5000l);
        System.out.println("第1个工人使用机器开始干活!");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        semaphore.release();
    }
}).start();

new Thread(() -> {
    try {
        semaphore.acquire();
        Thread.sleep(5000l);
        System.out.println("第2个工人使用机器开始干活!");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        semaphore.release();
    }
}).start();

new Thread(() -> {
    try {
        semaphore.acquire();
        Thread.sleep(5000l);
        System.out.println("第3个工人使用机器开始干活!");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        semaphore.release();
    }
}).start();

Semaphore是一种基于计数的信号量,可以设置一个阈值。多个线程竞争获取许可信号,然后在线程结束后归还自己的资源,超过阈值后,线程申请许可信号会被阻塞。通过Semaphore,可以控制同时访问资源的线程个数。通过Semaphore,可以用来构建数据库连接池这样的资源池。

Semaphore中主要提供了acquire()和release()方法来获得和释放资源。

Semaphore极其类似与ReentrantLock,两者很多方法类似。所以Semaphore的源码也极其类似于ReentrantLock。

Semaphore与ReentrantLock对比:

方法对比 SEMAPHORE   REENTRANTLOCK 备注
锁方法 acquire()   lockInterruptibly() 两者类似,都可以响应中断,可以被Thread.interrupt()方法中断
释放锁方法 release()   unLock() 释放资源方法,两者都在finally中执行
轮询锁和定时锁 tryAcquire(int permits, long timeout, TimeUnit unit)   tryLock(long timeout, TimeUnit unit) 都可以在指定时间或尝试获取锁
公平与非公平 Semaphore(int permits, boolean fair)   ReentrantLock(boolean fair) 都可以指定公平与非公平

2.源码分析

Semaphore ReentrantLock极其类似,如果要看Semaphore 源码,那可以参考我的两偏博客,通过ReentreantLock结合AbstractQueuedSynchronizer来看。

从ReentrantLock分析AbstractQueuedSynchronized源码

从ReentrantLock看AbstractQueuedSynchronized源码之Condition条件队列

版权声明
本文为[雷锅]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/3023261/blog/4780734