Java 为什么信号量中的acquire()方法不必同步?
我正在学习Java中的信号量,正在阅读这篇文章。我唯一不明白的是为什么在同步上下文中不使用acquire()方法。查看上述webiste中的示例: 它们创建一个信号量:Java 为什么信号量中的acquire()方法不必同步?,java,synchronization,semaphore,Java,Synchronization,Semaphore,我正在学习Java中的信号量,正在阅读这篇文章。我唯一不明白的是为什么在同步上下文中不使用acquire()方法。查看上述webiste中的示例: 它们创建一个信号量: private Semaphore semaphore = new Semaphore(100); 然后像这样拿到许可证: semaphore.acquire(); 现在,两个或多个线程不可能同时获取()吗?如果是这样的话,计数就有点问题了 或者,信号量本身是否处理同步 或者,信号量本身是否处理同步 是的,基本上就是这样。信
private Semaphore semaphore = new Semaphore(100);
然后像这样拿到许可证:
semaphore.acquire();
现在,两个或多个线程不可能同时获取()吗?如果是这样的话,计数就有点问题了
或者,信号量本身是否处理同步
或者,信号量本身是否处理同步
是的,基本上就是这样。信号量是线程安全的,如中所述:
内存一致性影响:在调用“release”方法(如release())之前的线程中的操作发生在另一个线程中成功的“acquire”方法(如acquire()之后的操作)之前
java.util.concurrent
包中对象上的大多数操作都是线程安全的。更多细节在最底部提供。信号量应该是快速的,因此使用来自不安全类的原子并发原语,如
使用这些原语,同步将在一个低得多的级别上进行,并且不需要监视器。(无锁同步)
事实上,同步是由循环使用CAS连续执行的,直到预期值等于写入/读取值。同步是由带有CAS操作的AbstractQueuedSynchronizer保证的
看到这里的地图了吗