/**
* autoPull 60s
* followUp 3s at the limiting case
* controller unknown
*
* Atomic class can guarantee the security of multiple threads operating on a variable.
* But when the value first inserted into the map, the atomic class has not yet worked.
* This situation should be treated cautiously.
*/
public void countUp(String pacs) {
AtomicInteger count = concurrents.get(pacs);
while (true) {
if (null != count) {
if (count.get() >= 10) {
sleep(1); // interval
continue;
}
count.incrementAndGet();
break;
}
// double check
synchronized (FindDicomService.class) { // first insertion needs to be very careful
if (null == concurrents.get(pacs)) {
concurrents.put(pacs, new AtomicInteger(1));
}else {
concurrents.get(pacs).incrementAndGet();
}
}
break;
}
}
/**
* @param pacs
*
* countDown the counts of one PACS's task
*/
public void countDown(String pacs) {
AtomicInteger count = concurrents.get(pacs);
if (null != count && count.get() > 0) {
count.decrementAndGet();
}
}
讲一下这段代码的场景。
主要是想控制对于同一个PACS的同时访问次数,这里假定为10。
主要是控制多个线程对于访问次数的加减,double check解决的是多个线程同时对一个计数为0的值的插入。 保证一个线程创建了这个值剩下的线程会安全的给这个值+1.