Java 通过synchronized关键字标记的关键部分与使用信号量有什么不同?
假设我有用方法A编写的关键部分代码Java 通过synchronized关键字标记的关键部分与使用信号量有什么不同?,java,multithreading,concurrency,Java,Multithreading,Concurrency,假设我有用方法A编写的关键部分代码 public void A(){ //Critical Section } 我可以使它同步,以便以独占方式访问它 synchronized public void A(){ } 或者,我也可以在java中使用信号量类 这两种方法在工作中有何不同?当使用信号量时,您必须记住在关键部分之前获取它并在关键部分之后释放它,但您可以为更多线程提供访问权限。因此,它通常用于限制对资源(如连接池)的访问。您还可以访问信号量对象及其所有方法,例如tryAcquire
public void A(){
//Critical Section
}
我可以使它同步,以便以独占方式访问它
synchronized public void A(){ }
或者,我也可以在java中使用信号量类
这两种方法在工作中有何不同?当使用信号量时,您必须记住在关键部分之前获取它并在关键部分之后释放它,但您可以为更多线程提供访问权限。因此,它通常用于限制对资源(如连接池)的访问。您还可以访问信号量对象及其所有方法,例如tryAcquire
,它可以让您编写更灵活的代码-然而,在关键部分的情况下,最好使用Lock
类(仅出于其目的)-如果不是synchronized
块
synchronized
块是简单的“低级别”(比信号量)同步,它只为一个线程提供对节的访问。您还可以通过使用构造将同步块限制为确实是关键部分的代码:
synchronized(? extends Object) {
// critical section
}
我收集了一个有趣的链接列表,这些链接将阐明这些差异
首先,请注意有关锁/同步/监视器的术语混乱,人们(有时)会互换使用这些术语
其次,下面的链接不是按重要性/相关性/清晰度排序的
可能的副本请查看