操作系统的信号量与Java给出的信号量有什么区别?

时间:2014-11-20 15:40:20

标签: java multithreading concurrency

在OS中,Semaphore是基本的同步模式。因此,对于并发性,我们使用SemaphoreMutex

但是,在Java中为了并发,我在书Concurrent Programming in Java by Doug Lea中读到基本同步模式是为每个对象实现的MonitorLock and WaitSet) 。仅在Java 5中添加了Semaphores(以及Locks和其他并发类)。

那么这个Semaphore与操作系统提供的内容有何不同(如Semaphore库的PThread)?

java是否使用OS Semaphore来实现其对象监视器?

2 个答案:

答案 0 :(得分:0)

pthreads和Java锁定之间的主要区别在于Java对应项是 reentrant 。这意味着在Java中,如果你获得了已经获得的相同锁,它就不会死锁(注意pthreads也可能有重入实现)。

请注意,Java Semaphore类(以及java.util.concurrent包中的其他类)的现代实现直接使用CPU指令,例如Compare-and-Swap,而不是OS提供的系统调用(或类似)说明硬件是否支持它。)

答案 1 :(得分:0)

  

仅在Java 5中添加了信号量......

信号量是一个非常古老的概念。那里有许多使用信号量的旧代码和旧算法。如果你想将一些旧的代码移植到Java,你可以使用java.util.concurrent.Semaphore而不是编写自己的代码。

我只是在这里猜测,但我敢打赌,这是他们将Semaphore添加到图书馆的主要原因。