为什么信号量中的acquire()方法不需要同步?

8
我开始学习Java中的信号量,并阅读了这篇文章http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html。唯一让我困惑的是为什么acquire()方法不在同步上下文中使用。看看上面网站的例子:
他们创建了一个信号量:
private Semaphore semaphore = new Semaphore(100);

并像这样获得许可证:
semaphore.acquire();

现在,是否有可能两个或多个线程同时尝试使用acquire()方法?如果是这样,计数会有一些小问题。

或者,信号量本身处理同步吗?

3个回答

10
或者,信号量本身是否处理同步?
是的,基本上就是这样。如Javadoc中所解释的那样,信号量是线程安全的:
“内存一致性影响:在线程调用“release”方法(例如release())之前的操作发生在另一个线程成功调用“acquire”方法(例如acquire())之后的操作之前。” java.util.concurrent包中的大多数对象操作都是线程安全的。更多详细信息请参见包javadoc底部。

3
信号量应该很快,因此使用Unsafe类中的原子并发原语,如CAS(比较和交换)
通过这些原语,在更低的级别上进行同步,不需要监视器。(无锁同步)。
实际上,同步是通过循环使用CAS连续执行,直到期望值等于写入/读取的值。

0

同步由使用CAS操作的AbstractQueuedSynchronizer保证

在此处查看javadoc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接