Java tutorial
/** * Copyright 2015 Palantir Technologies * * Licensed under the BSD-3 License (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://opensource.org/licenses/BSD-3-Clause * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.palantir.lock.impl; import java.util.Map; import javax.annotation.concurrent.ThreadSafe; import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.palantir.lock.LockClient; @ThreadSafe class LockClientIndices { private final Map<LockClient, Integer> indexByClient = Maps.newConcurrentMap(); private final Map<Integer, LockClient> clientByIndex = Maps.newConcurrentMap(); public LockClientIndices() { indexByClient.put(LockClient.ANONYMOUS, -1); clientByIndex.put(-1, LockClient.ANONYMOUS); } int toIndex(LockClient client) { Integer index = indexByClient.get(client); if (index != null) { return index; } synchronized (this) { index = indexByClient.get(client); if (index != null) { return index; } int newIndex = indexByClient.size(); indexByClient.put(client, newIndex); clientByIndex.put(newIndex, client); return newIndex; } } LockClient fromIndex(int index) { return Preconditions.checkNotNull(clientByIndex.get(index)); } Iterable<LockClient> fromIndices(Iterable<Integer> indices) { return Iterables.transform(indices, new Function<Integer, LockClient>() { @Override public LockClient apply(Integer index) { return fromIndex(index); } }); } }