5

有人可以解释 Java 中各种同步方法之间的各种差异吗?

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

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

干杯!

4

2 回答 2

3

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

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

Java 原生支持线程和同步。同步线程的本机(或低级)方法是使用同步块和方法(== 临界区),wait()并且notify().

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

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

于 2012-04-17T08:26:26.347 回答