循环中的 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)
可能意味着其他线程数较少的线程总是先通过。
很遗憾我没有找到规格。
我必须让 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)
可能意味着其他线程数较少的线程总是先通过。
很遗憾我没有找到规格。