Java 信号量实现和设计相关问题
Java Semaphore Implementation and Design related questions
我目前正在用 C++ 设计计数信号量,试图符合与 Java 相同级别的标准,但 InterupptedExceptions 除外,因为 C++ std:: 线程不支持中断。我正在阅读 Java 中的 class 文档,遇到了两个让我困惑的问题。
https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Semaphore.html
问题 1:
关于许可的释放,我看到在执行 acquire 时有一个声明 "There is no requirement that a thread that releases a permit must have acquired that permit by calling acquire()"。
如果在设计中没有通过同一线程获取许可和释放许可的所有权概念,那么在下面的情况下会发生什么。
一些流氓线程只是试图 运行 释放并且它根本没有获得任何东西。那什么会被释放?
它默默地 return 什么都不做吗?
问题 2:
如果线程获取信号量计数并抛出异常,而释放可能只是因为异常传播到该线程函数的 class 之外而错过了释放,会发生什么情况。在这种情况下这会导致许可泄漏吗?
some rogue thread simply tries to run release and it has never
acquired any at all. What will get released then? does it silently
return and do nothing?
最好叫它increment
而不是release
或return
。您甚至可以使用否定权限创建 Semaphore
:
Semaphore semaphore = new Semaphore(-1);
在这种情况下,如果线程 A 尝试 aquire()
,它将被阻塞,直到其他线程将权限增加两次 release()
。
Does this lead to permit leak in such case ?
这就是为什么建议在资源有限的情况下使用Semaphore
和try catch finally
块:
semaphore.aquire();
try {
} catch () {
} finally {
semaphore.release();
}
我的两分钱:
some rogue thread simply tries to run release and it has never acquired any at all. What will get released then? does it silently return and do nothing?
Semaphore不是锁,所以释放前不需要获得许可。您甚至可以使用负初始值初始化信号量。所以回答你的第一个问题是,如果任何线程释放许可,它只会将许可计数增加许可数量。
Does this lead to permit leak in such case ?
在类似的线路上,如果一个线程通过获取减少许可并由于任何原因失败而没有释放它,计数将保持不变。我不会称之为泄漏,因为可能会出现这样一种情况,即最终用户只是希望使用许可,而不是释放许可。
我目前正在用 C++ 设计计数信号量,试图符合与 Java 相同级别的标准,但 InterupptedExceptions 除外,因为 C++ std:: 线程不支持中断。我正在阅读 Java 中的 class 文档,遇到了两个让我困惑的问题。
https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Semaphore.html
问题 1:
关于许可的释放,我看到在执行 acquire 时有一个声明 "There is no requirement that a thread that releases a permit must have acquired that permit by calling acquire()"。 如果在设计中没有通过同一线程获取许可和释放许可的所有权概念,那么在下面的情况下会发生什么。
一些流氓线程只是试图 运行 释放并且它根本没有获得任何东西。那什么会被释放? 它默默地 return 什么都不做吗?
问题 2:
如果线程获取信号量计数并抛出异常,而释放可能只是因为异常传播到该线程函数的 class 之外而错过了释放,会发生什么情况。在这种情况下这会导致许可泄漏吗?
some rogue thread simply tries to run release and it has never acquired any at all. What will get released then? does it silently return and do nothing?
最好叫它increment
而不是release
或return
。您甚至可以使用否定权限创建 Semaphore
:
Semaphore semaphore = new Semaphore(-1);
在这种情况下,如果线程 A 尝试 aquire()
,它将被阻塞,直到其他线程将权限增加两次 release()
。
Does this lead to permit leak in such case ?
这就是为什么建议在资源有限的情况下使用Semaphore
和try catch finally
块:
semaphore.aquire();
try {
} catch () {
} finally {
semaphore.release();
}
我的两分钱:
some rogue thread simply tries to run release and it has never acquired any at all. What will get released then? does it silently return and do nothing?
Semaphore不是锁,所以释放前不需要获得许可。您甚至可以使用负初始值初始化信号量。所以回答你的第一个问题是,如果任何线程释放许可,它只会将许可计数增加许可数量。
Does this lead to permit leak in such case ?
在类似的线路上,如果一个线程通过获取减少许可并由于任何原因失败而没有释放它,计数将保持不变。我不会称之为泄漏,因为可能会出现这样一种情况,即最终用户只是希望使用许可,而不是释放许可。