Sometimes it is required to create bounded collection.The main aim of the question is to create a collection so that it can contain only a fixed number of elements at a particular instant of time.There are many approaches to do it.There are some third party apis like apache.commons,Guava which provides such functionalities.
In our below implementation we will take a hashSet and make it bounded.Similarly we can make any collection a bounded collection.
But our aim here is to not to use any third party apis, rather we can implement it using some provided tools in Java.We are going to implement it by using an existing synchronizers ie. semaphore.We will take a semaphore with fixed number of permit.Before adding something in our collection we will acquire a permit and and if in case of any exception of adding will release the permit.And also when removing something from the collection we will release a permit.To read more about semaphore please visit the series semaphore and mutex
Implementation details:
In our below implementation we will take a hashSet and make it bounded.Similarly we can make any collection a bounded collection.
package com.brainatjava.test;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Semaphore;
public class BoundedCollection {
private final Set hashSet;
private final Semaphore semaphore;
public BoundedCollection(int nosOfPermit) {
this.hashSet = Collections.synchronizedSet(new HashSet());
semaphore = new Semaphore(nosOfPermit);
}
public boolean add(T o) throws InterruptedException {
semaphore.acquire();
boolean isSomethingAdded = false;
try {
isSomethingAdded = hashSet.add(o);
return isSomethingAdded;
} finally {
if (!isSomethingAdded)
semaphore.release();
}
}
public boolean remove(Object o) {
boolean isSomethingRemoved = hashSet.remove(o);
if (isSomethingRemoved)
semaphore.release();
return isSomethingRemoved;
}
}
No comments:
Post a Comment