我陷入用Java信号量和正在读这篇文章http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html 。 我没有得到的唯一的事情就是为什么采集()方法不同步的情况下使用。 综观从上述网站的例子:
他们创造一个信号:
private Semaphore semaphore = new Semaphore(100);
并获得许可,就像这样:
semaphore.acquire();
现在,是不是很可能两个或多个线程试图获得()在同一时间? 如果是的话,就不会有与统计一个小问题。
或者,也旗语自己来处理同步?
或者,也旗语自己来处理同步?
是的,这是基本的。 在解释的信号量是线程安全的Javadoc :
内存一致性效果:调用一个“释放”方法,诸如释放之前操作在一个线程()发生-前行动以下在另一个线程成功“获取”方法,例如获取()。
在该对象的大多数操作java.util.concurrent
包是线程安全的。 在最底层提供了更多的细节包的Javadoc 。
信号灯应该是快,因此使用原子并发原语从Unsafe
类,如CAS(比较和交换) 。
有了这些原语同步发生在非常低的水平,不需要显示器。 (无锁同步)。
事实上,同步是通过使用汽车无CAS直到预期值等于写入/读取值的循环进行的。
同步是通过用的AbstractQueuedSynchronizer CAS操作保证
看的javadoc这里