Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过synchronized关键字标记的关键部分与使用信号量有什么不同?_Java_Multithreading_Concurrency - Fatal编程技术网

Java 通过synchronized关键字标记的关键部分与使用信号量有什么不同?

Java 通过synchronized关键字标记的关键部分与使用信号量有什么不同?,java,multithreading,concurrency,Java,Multithreading,Concurrency,假设我有用方法A编写的关键部分代码 public void A(){ //Critical Section } 我可以使它同步,以便以独占方式访问它 synchronized public void A(){ } 或者,我也可以在java中使用信号量类 这两种方法在工作中有何不同?当使用信号量时,您必须记住在关键部分之前获取它并在关键部分之后释放它,但您可以为更多线程提供访问权限。因此,它通常用于限制对资源(如连接池)的访问。您还可以访问信号量对象及其所有方法,例如tryAcquire

假设我有用方法A编写的关键部分代码

public void A(){
  //Critical Section 
}
我可以使它同步,以便以独占方式访问它

synchronized public void A(){ }
或者,我也可以在java中使用
信号量


这两种方法在工作中有何不同?

当使用信号量时,您必须记住在关键部分之前获取它并在关键部分之后释放它,但您可以为更多线程提供访问权限。因此,它通常用于限制对资源(如连接池)的访问。您还可以访问信号量对象及其所有方法,例如
tryAcquire
,它可以让您编写更灵活的代码-然而,在关键部分的情况下,最好使用
Lock
类(仅出于其目的)-如果不是
synchronized

synchronized
块是简单的“低级别”(比信号量)同步,它只为一个线程提供对节的访问。您还可以通过使用构造将同步块限制为确实是关键部分的代码:

synchronized(? extends Object) {
    // critical section
}

我收集了一个有趣的链接列表,这些链接将阐明这些差异

首先,请注意有关锁/同步/监视器的术语混乱,人们(有时)会互换使用这些术语

其次,下面的链接不是按重要性/相关性/清晰度排序的

可能的副本请查看