JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

java juc Semaphore 使用 javason

wys521 2024-11-06 20:35:03 精选教程 32 ℃ 0 评论

Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。

信号量经常被用来限制线程数量。访问一些(物理或逻辑)资源。

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 场景:一个停车场只有3个停车位,6辆车需要停;
 */
public class SemaphoreDemo {

    public static void main(String[] args) {

        Semaphore semaphore = new Semaphore( 3 );

        for (int i=0 ;i< 6 ;i++){
            new Thread(()->{
                try {
                    //获取一个许可
                    semaphore.acquire();
                    System.out.println( Thread.currentThread().getName() + ":获得一个停车位" );
                    //睡眠2S
                    TimeUnit.SECONDS.sleep( 2 );
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    //释放获取的许可
                    semaphore.release();
                    System.out.println( Thread.currentThread().getName() + ":空闲一个停车位" );
                }
            }).start();
        }
    }
}

Semaphore实现原理

如下图构造函数为许可数量的参数,默认会创建一个非公平的锁的同步阻塞队列。

把初始令牌数量赋值给同步队列的state状态,state的值就代表当前所剩余的令牌数量


获取令牌

semaphore.acquire();

1、当前线程会尝试去同步队列获取一个令牌,获取令牌的过程也就是使用原子的操作去修改同步队列的state ,获取一个令牌则修改为state=state-1。

2、 当计算出来的state<0,则代表令牌数量不足,此时会创建一个Node节点加入阻塞队列,挂起当前线程。

3、当计算出来的state>=0,则代表获取令牌成功。

释放令牌

semaphore.release();

1、释放许可证,将其返回到信号灯。

2、释放令牌成功之后,同时会唤醒同步队列的所有阻塞节点共享节点线程

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表