循环中的 acquire(number) 和 acquire() 有什么区别

What's the difference between acquire(number) and acquire() in a loop

我必须让 2 个线程交替执行,而且其中一个线程必须比另一个多执行 N 次。

public void init(int count) {
     semaphore1 = new Semaphore(1);
     semaphore2 = new Semaphore(0);
     num=count;
}

class F1Thread extends Thread {

    public void run() {
        semaphore1.acquire();
        for(int i=0;i<num;i++)
        f1();
        semaphore2.release();
    }

class F2Thread extends Thread {

    public void run()  {
       semaphore2.acquire();
       f2();
       semaphore1.release();
    }

这是我的解决方案,但在此之前我尝试获取所有许可而不是 1 并进行循环

public void init(int count) {
     semaphore1 = new Semaphore(count);
     semaphore2 = new Semaphore(0);
     num=count;
}

class F1Thread extends Thread {

    public void run() {
        semaphore1.acquire(count);
        f1();
        semaphore2.release();
    }

class F2Thread extends Thread {

    public void run()  {
       semaphore2.acquire();
       f2();
       semaphore1.release(count);
    }

我的观点是

 for(int i=0;i<number;i++)
 semaphore.acquire();

semaphore.acquire(number);

不应该执行相同的操作吗?

如果信号量有5个许可,

  • 10 次 acquire() 将获得 5 并阻止。
  • acquire(10) 会立即阻塞,直到释放 10 个许可。

但是我没有在 javadocs 中发现这种行为,也没有在查看源代码之后发现这种行为。

似乎贪心 acquire(number) 可能意味着其他线程数较少的线程总是先通过。

很遗憾我没有找到规格。