java - Java 中各种线程同步选项之间有什么区别?

标签 java multithreading synchronization locking mutex

谁能解释一下 Java 中各种同步方法之间的各种区别?

  • 同步块(synchronized block)(如监视器?)
  • 锁 - Java 并发 lock.lock()/lock.unlock()
  • 信号量..?
  • Object.wait() & Object.notify()(像 Mutex?)
  • 其他类

所以我真的很想知道常用的不同 Java 同步选项是什么,以及它们如何映射到“传统”/理论上的互斥量、信号量、锁和监视器。

干杯!

最佳答案

我将对每个进行简要说明:

  • 同步块(synchronized block)是您的平均临界区。没有太多的控制。一次只能有一个线程获取锁,并在同步范围结束时自动释放锁。
  • 锁是同步块(synchronized block)的一个更灵活的版本。根据实现的不同,它们可能是可重入的,或者可能支持像 tryLock 这样的操作,它只在锁空闲时尝试获取锁,否则立即返回。需要明确解锁锁。
  • 信号量基本上是一个锁,但具有多个线程可以同时进入临界区的附加功能。它基于更一般的“许可”概念进行操作,其中信号量可能具有多个线程想要获取的可用许可。一个线程可以获取一个或多个许可,也可以恢复一个或多个许可。它允许更多地根据“可用资源”而不是“需要保护的代码”来考虑同步。
  • wait/notify 大致相当于条件变量的概念。同样,它们必须受到同步块(synchronized block)的保护,并且只有在被用作监视器的对象上持有锁时调用它们才能正常工作。

关于java - Java 中各种线程同步选项之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10187577/

相关文章:

java - 为什么我们不同步 Web 服务?

c - C 中 Logger 线程的线程安全队列

java - 无法使用 JPA 工具从数据库生成实体

java - 使用 jaxb 编码时使用派生类

java - Thread类中调用start()方法的一些问题

Java 线程安全缓存,如果正在获取新缓存,则返回旧缓存

c# - 任务中的秒表似乎在所有任务中都是可加的,只想测量任务间隔

java - HttpClient 异常 : java. lang.IllegalArgumentException: 主机参数为空

java - 如何将 AndroidAnnotations SharedPref 与 PreferenceActivity 一起使用?

java - 线程跳过一些迭代