在创建我的应用程序架构时,我遇到了需要描述的一个结构。
我非常确定有一个已知的设计模式具有相同的功能,因为我认为开发它的问题确实很普遍。
我编写了自己的实现,但我总是尝试使用“内置语言”模式的实现,因此,请帮助我命名此结构。
这个想法接近于读者-写者模式。我们有一个“容器”,可以通过键()添加对象。我们也可以通过键获取这些对象,并从容器中删除它们。
因此,实现的类应该有两个方法:
以下是最有趣的部分。 这个容器应该在多线程环境下工作,如下所示:
这是我对该模式的Java实现:
我非常确定有一个已知的设计模式具有相同的功能,因为我认为开发它的问题确实很普遍。
我编写了自己的实现,但我总是尝试使用“内置语言”模式的实现,因此,请帮助我命名此结构。
这个想法接近于读者-写者模式。我们有一个“容器”,可以通过键()添加对象。我们也可以通过键获取这些对象,并从容器中删除它们。
因此,实现的类应该有两个方法:
void putObject(Key key, Object object);
Object getObject(Key key); // remove <Key,Object> from container.
以下是最有趣的部分。 这个容器应该在多线程环境下工作,如下所示:
- 如果没有与键相关联的对象,在调用get(Key key)方法时,调用线程应等待此容器中的对象。
- 当另一个线程调用putObject(Key key,Object object)方法时,它应检查是否有一些线程正等待此对象,如果是,则发出信号并唤醒等待的线程。
这是我对该模式的Java实现:
private static interface BlackBox {
public void addObject(IdObject object);
public IdObject getObject(ObjectId id);
}
private static class BlackBoxImpl implements BlackBox {
private final Lock conditionLock = new ReentrantLock();
private final Map<ObjectId, IdObject> savedObjects;
private final Map<ObjectId, Condition> waitingConditions;
public BlackBoxImpl() {
this.savedObjects = new ConcurrentHashMap<ObjectId, IdObject>(20);
this.waitingConditions = new ConcurrentHashMap<ObjectId, Condition>(20);
}
@Override
public void addObject(IdObject object) {
savedObjects.put(object.getId(), object);
if (waitingConditions.containsKey(object.getId())) {
Condition waitCondition = waitingConditions.get(object.getId());
conditionLock.lock();
waitCondition.signal();
conditionLock.unlock();
}
}
@Override
public IdObject getObject(ObjectId id) {
if (savedObjects.containsKey(id)) {
return savedObjects.get(id);
} else {
conditionLock.lock();
Condition waitCondition = conditionLock.newCondition();
waitingConditions.put(id, waitCondition);
waitCondition.awaitUninterruptibly();
conditionLock.unlock();
return savedObjects.get(id);
}
}
}
private static interface IdObject {
public ObjectId getId();
}
private static class IdObjectImpl implements IdObject {
protected final ObjectId id;
public IdObjectImpl(ObjectId id) {
this.id = id;
}
@Override
public ObjectId getId() {
return id;
}
}
private static interface ObjectId {
}
private static class ObjectIdImpl implements ObjectId {
}