Why does the acquire() method in Semaphores not have to be synchronized?

六眼飞鱼酱① 提交于 2019-12-04 23:11:13

问题


I am getting into Semaphores in Java and was reading this article http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html . The only thing I don't get is why the acquire() method is not used in a synchronized context. Looking at the example from the above webiste:

They create a semaphore:

private Semaphore semaphore = new Semaphore(100);

and get a permit just like this:

semaphore.acquire();

Now, wouldn't it be possible that two or more threads try to acquire() at the same time? If so, there would be a little problem with the count.

Or, does the semaphore itself handle the synchronization?


回答1:


Or, does the semaphore itself handle the synchronization?

Yes that's basically it. Semaphores are thread safe as explained in the javadoc:

Memory consistency effects: Actions in a thread prior to calling a "release" method such as release() happen-before actions following a successful "acquire" method such as acquire() in another thread.

Most operations on the objects in the java.util.concurrent package are thread safe. More details are provided at the very bottom of the package javadoc.




回答2:


Semaphores ought to be fast and therefore use the atomic concurrency primitives from the Unsafe class, like CAS (compare and swap).

With these primitives synchronization happens on a much lower level and monitors are not needed. (Lock-free synchronization).

In fact the synchronization is performed by a loop continously using CAS until the expected value equals the written/read value.




回答3:


synchronization is guaranteed by AbstractQueuedSynchronizer with CAS operations

see the javadoc here



来源:https://stackoverflow.com/questions/14892897/why-does-the-acquire-method-in-semaphores-not-have-to-be-synchronized

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!