簡単にしましょう。通常、 update() は複数のスレッドによって実行されます。これが真になると、 if(!isSplit && users.size() >= Constants.SPLIT_THRESHOLD) split() 関数がセル化されているときに誰も update() メソッドを実行しないようにしたい。
public class Cell {
private ConcurrentHashMap<Integer, User> users;
private ConcurrentHashMap<Long, Cell> subCells;
private boolean isSplit;
private Lock splitLock;
public Set<Integer> update(User user){
//code executed by 1 thread
if(!isSplit && users.size() >= Constants.SPLIT_THRESHOLD)
{
splitLock.lock();
{
try
{
split();
isSplit = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
finally
{
splitLock.unlock();
}
}
}
// code executed by multiple threads
// on users hashmap
}
private void merge(){}
private void split(){}
}