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

时间:2018-03-15 14:55:38

标签: java multithreading semaphore

我必须交替执行两个线程,其中一个线程必须比另一个执行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);

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

1 个答案:

答案 0 :(得分:0)

如果信号量有5个许可,

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

但是我没有在javadocs中找到这种行为,也没有在关注来源之后。

似乎贪婪的acquire(number)可能意味着数量较少的其他线程总是首先传递。

不幸的是我没有找到规范。