在OS中,Semaphore
是基本的同步模式。因此,对于并发性,我们使用Semaphore
或Mutex
。
但是,在Java中为了并发,我在书Concurrent Programming in Java by Doug Lea
中读到基本同步模式是为每个对象实现的Monitor
(Lock and WaitSet
) 。仅在Java 5中添加了Semaphores
(以及Locks
和其他并发类)。
那么这个Semaphore
与操作系统提供的内容有何不同(如Semaphore
库的PThread
)?
java是否使用OS Semaphore来实现其对象监视器?
答案 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
添加到图书馆的主要原因。