java - 由synchronized关键字标记的关键部分与使用信号量有何不同?

标签 java multithreading concurrency

假设我有用方法 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/

相关文章:

JavaFX 我无法在场景生成器中创建的 Canvas 上绘制任何内容

java - 使用 Scanner 和 nextLine 结束程序

java - 打包 Java 软件以供专业用途

C - 多个进程写入同一个日志文件

java - 如何获取微调器值的整数值?

c# - 减少 .NET 应用程序中的线程数量

iOS:有选择地禁用 captureOutput 的处理:didOutputSampleBuffer:fromConnection:来自 AVFoundation 中的主线程

java - 如何调用 run() 无限次刷新屏幕信息,直到用户关闭应用程序

c# - 工作 MvvM 和并发

java - 类中的线程安全