セマフォ Java並行プログラミングの詳細な説明

序文

Semaphore現在、マルチスレッド環境で広く使用されているセマフォは、プロセス制御に応用できる非常に重要な概念です。Java並行処理ライブラリのセマフォacquire() は、ライセンスを取得し、そうでない場合は待機しrelease()、ライセンスを解放することで、同時にアクセスできるリソースの数を制御できます。たとえば、Windows では、共有ファイルにアクセスするクライアントの最大数を設定できます。

施工方法

Semaphore クラスは、次の 2 つのコンストラクターを提供する java.util.concurrent パッケージの下にあります。

//参数permits表示许可数目,即同时可以允许多少线程进行访问
public Semaphore(int permits) {
    
              
    sync = new NonfairSync(permits);
}

//这个多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可
public Semaphore(int permits, boolean fair) {
    
        
    sync = (fair)? new FairSync(permits) : new NonfairSync(permits);
}

一般的な方法

いくつかの重要なメソッドがあります。最初のメソッドは、acquire ()、release () メソッドです。

public void acquire() throws InterruptedException {
    
      }     //获取一个许可
public void acquire(int permits) throws InterruptedException {
    
     }    //获取permits个许可
public void release() {
    
     }          //释放一个许可
public void release(int permits) {
    
     }    //释放permits个许可

acquire() は、ライセンスを取得するために使用されます。ライセンスを取得できない場合は、ライセンスが取得されるまで待機します。

release() は、ライセンスを解放するために使用されます。ライセンスをリリースする前に、必ずライセンスを取得してください。そうしないと、ライセンスの総数が正しくなくなります

実行結果をすぐに取得したい場合は、次の方法を使用できます。

public boolean tryAcquire() {
    
     };    //尝试获取一个许可,若获取成功,则立即返回true,若获取失败,则立即返回false
public boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException {
    
     };  //尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false
public boolean tryAcquire(int permits) {
    
     }; //尝试获取permits个许可,若获取成功,则立即返回true,若获取失败,则立即返回false
public boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException {
    
     }; //尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false
public int availablePermits();  // 返回此信号量中可用的许可证的当前数量。

コードの練習

例によるSemaphore特定の使用法:

駐車場には5台の駐車スペースがあり、駐車するには10台の車が駐車する必要があります.現時点では、駐車場が最大の場合は5台の車しか入らず、1台の車しか入らないようにする必要があります.出たら入る。

コード:

 public static void main(String[] args) {
    
    
        // 停车场车位数量
        Semaphore semaphore = new Semaphore(5);

        for (int i = 1; i <= 10; i++) {
    
    
            Thread thread = new Thread(() -> {
    
    
                try {
    
    
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "进入停车场");
                    TimeUnit.SECONDS.sleep(new Random().nextInt(10));
                    System.out.println(Thread.currentThread().getName() + "驶离停车场");
                } catch (InterruptedException e) {
    
    
                    throw new RuntimeException(e);
                }finally {
    
    
                    semaphore.release();
                }
            }, i + "号车");
            thread.start();
        }
    }

操作結果:

1号车进入停车场
4号车进入停车场
3号车进入停车场
2号车进入停车场
5号车进入停车场
1号车驶离停车场
7号车进入停车场
4号车驶离停车场
6号车进入停车场
5号车驶离停车场
8号车进入停车场
3号车驶离停车场
9号车进入停车场
9号车驶离停车场
10号车进入停车场
2号车驶离停车场
6号车驶离停车场
7号车驶离停车场
8号车驶离停车场
10号车驶离停车场

Process finished with exit code 0

Semaphore実際、これはロックに似ており、通常、特定のリソース セットへのアクセスを制御するために使用されます。

Supongo que te gusta

Origin blog.csdn.net/weixin_43847283/article/details/128517491
Recomendado
Clasificación