Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么信号量中的acquire()方法不必同步?_Java_Synchronization_Semaphore - Fatal编程技术网

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

Java 为什么信号量中的acquire()方法不必同步?,java,synchronization,semaphore,Java,Synchronization,Semaphore,我正在学习Java中的信号量,正在阅读这篇文章。我唯一不明白的是为什么在同步上下文中不使用acquire()方法。查看上述webiste中的示例: 它们创建一个信号量: private Semaphore semaphore = new Semaphore(100); 然后像这样拿到许可证: semaphore.acquire(); 现在,两个或多个线程不可能同时获取()吗?如果是这样的话,计数就有点问题了 或者,信号量本身是否处理同步 或者,信号量本身是否处理同步 是的,基本上就是这样。信

我正在学习Java中的信号量,正在阅读这篇文章。我唯一不明白的是为什么在同步上下文中不使用acquire()方法。查看上述webiste中的示例:

它们创建一个信号量:

private Semaphore semaphore = new Semaphore(100);
然后像这样拿到许可证:

semaphore.acquire();
现在,两个或多个线程不可能同时获取()吗?如果是这样的话,计数就有点问题了

或者,信号量本身是否处理同步

或者,信号量本身是否处理同步

是的,基本上就是这样。信号量是线程安全的,如中所述:

内存一致性影响:在调用“release”方法(如release())之前的线程中的操作发生在另一个线程中成功的“acquire”方法(如acquire()之后的操作)之前


java.util.concurrent
包中对象上的大多数操作都是线程安全的。更多细节在最底部提供。

信号量应该是快速的,因此使用来自
不安全类的原子并发原语,如

使用这些原语,同步将在一个低得多的级别上进行,并且不需要监视器。(无锁同步)


事实上,同步是由循环使用CAS连续执行的,直到预期值等于写入/读取值。

同步是由带有CAS操作的AbstractQueuedSynchronizer保证的

看到这里的地图了吗