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

时间:2012-04-17 08:17:17

标签: java multithreading synchronization locking mutex

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

  • Syncornized块(如显示器?)
  • 锁定 - Java并发lock.lock()/ lock.unlock()
  • 信号灯..?
  • Object.wait()& Object.notify()(如Mutex?)
  • 其他课程

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

干杯!

2 个答案:

答案 0 :(得分:3)

我将简要说明每一个:

  • synchronized块是您的平均关键部分。没有给予太多控制。只有一个线程可以一次获取锁定,并且当同步范围结束时它将自动释放它。
  • 锁是同步块的更灵活的版本。根据实现情况,它们可能是可重入的,或者可能支持tryLock之类的操作,如果它是空闲的,它只会尝试锁定,否则会立即返回。需要明确解锁锁。
  • 信号量基本上是一个锁,但具有添加的功能,即多个线程可以一次进入临界区。它遵循更为笼统的“许可”概念,其中信号量可能具有线程想要获得的若干许可。线程可以获得一个或多个许可,并可以恢复一个或多个许可。它允许在“可用资源”方面考虑更多同步,而不是“需要保护的代码”。
  • wait / notify大致相当于条件变量的概念。同样,它们必须受同步块保护,只有在用作监视器的对象上保持锁定时才会调用它们。

答案 1 :(得分:1)

Java本身支持线程和同步。同步线程的本机(或低级)方法是使用synchronized块和方法(== critical section),wait()notify()

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

有关详细信息,请参阅此文章:http://docs.oracle.com/javase/tutorial/essential/concurrency/