【问题标题】:What are the differences between various threading synchronization options in Java?Java中各种线程同步选项有什么区别?
【发布时间】:2012-04-28 13:50:51
【问题描述】:

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

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

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

干杯!

【问题讨论】:

  • It's already explained in many places。请花时间学习一些现有的教程,如果您有具体的、更集中的问题,请再回来。
  • 我建议您阅读Java Concurrency in Practice。这是一本很棒的书,尤其是因为您似乎对 java 多线程很感兴趣。
  • 货币教程通常关注 Java 并发的一个方面。我认为真正有用的是在一个位置总结各种选项及其优缺点和用例。维基的好人选。

标签: java multithreading synchronization locking mutex


【解决方案1】:

Java 原生支持线程和同步。同步线程的本机(或低级)方法是使用同步块和方法(== 关键部分)wait()notify()

这种技术可以让你做任何你想做的事情,但不幸的是,这种方法有时非常冗长。 Doug Lea 最初在 Apache 项目下开发了并发包。然后这个软件包被 Sun Microsystems 采用。这个包提供了更方便的API。

查看这篇文章了解更多详情:http://docs.oracle.com/javase/tutorial/essential/concurrency/

【讨论】:

    【解决方案2】:

    我将简要说明每个:

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

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2011-05-06
      • 2015-10-18
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多