1つの可能性は、getメソッドとaddメソッドをプロキシまたはオーバーライドするクラスでリストをラップすることです。
Lock
このように、メソッドで明示を使用できるため、add
一度に1つのスレッドのみを追加できます。
たとえば、次を参照してください。
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html
List
これを行うには、実装を拡張してadd
andget
メソッド(または関連するすべてのメソッド)をオーバーライドするか、継承の代わりにcompositionを使用して、呼び出しをリストに転送するプロキシクラスを作成しますが、add
andget
を明示的に取得します。ロックの。
非常に単純な例は次のようになります。
public class SharedMemory<K> {
private final List<K> memoryList;
private static final ReentrantLock lock = new ReentrantLock();
public SharedMemory() {
memoryList = new ArrayList<>();
}
public void storeItem(K item) {
memoryList.add(item);
}
public K getItem(int pos){
lock.lock();
try{
return memoryList.get(pos);
} finally {
lock.unlock();
}
}
}