假设我有用方法 A 编写的临界区代码
public void A(){
//Critical Section
}
我可以使其同步,以便允许对其进行独占访问
synchronized public void A(){ }
或者我也可以在java中使用Semaphore
类
这两种方法在工作中有何不同?
最佳答案
使用信号量时,您必须记住在关键部分之前获取它并在之后释放它,但是您可以为更多线程授予访问权限。因此它通常用于限制对资源的访问,例如连接池。您还可以访问 Semaphore 对象及其所有方法,例如 tryAcquire
,它可以让您编写更灵活的代码 - 不过,在关键部分的情况下,最好使用 Lock
类(只是由于它的目的) - 如果不是同步
block 。
synchronized
block 是简单的“较低级别”(比信号量)同步,它只提供对一个线程的部分的访问。您还可以通过使用构造将同步块(synchronized block)限制为确实是关键部分的代码:
synchronized(? extends Object) {
// critical section
}
关于java - 由synchronized关键字标记的关键部分与使用信号量有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20097504/