为什么在信号灯的获取()方法没有被同步?(Why does the acquire() method

2019-08-16 23:55发布

我陷入用Java信号量和正在读这篇文章http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html 。 我没有得到的唯一的事情就是为什么采集()方法不同步的情况下使用。 综观从上述网站的例子:

他们创造一个信号:

private Semaphore semaphore = new Semaphore(100);

并获得许可,就像这样:

semaphore.acquire();

现在,是不是很可能两个或多个线程试图获得()在同一时间? 如果是的话,就不会有与统计一个小问题。

或者,也旗语自己来处理同步?

Answer 1:

或者,也旗语自己来处理同步?

是的,这是基本的。 在解释的信号量是线程安全的Javadoc :

内存一致性效果:调用一个“释放”方法,诸如释放之前操作在一个线程()发生-前行动以下在另一个线程成功“获取”方法,例如获取()。

在该对象的大多数操作java.util.concurrent包是线程安全的。 在最底层提供了更多的细节包的Javadoc 。



Answer 2:

信号灯应该是快,因此使用原子并发原语从Unsafe类,如CAS(比较和交换) 。

有了这些原语同步发生在非常低​​的水平,不需要显示器。 (无锁同步)。

事实上,同步是通过使用汽车无CAS直到预期值等于写入/读取值的循环进行的。



Answer 3:

同步是通过用的AbstractQueuedSynchronizer CAS操作保证

看的javadoc这里



文章来源: Why does the acquire() method in Semaphores not have to be synchronized?