java 命名模式_java-该“容器设计模式”如何命名?

在创建我的应用程序时.体系结构我面临着一种结构的需求,下面将对此进行描述.

我很确定,有一个众所周知的具有相同功能的设计模式,因为我认为我为之开发的这个问题确实很普遍.

我为此编写了自己的实现,但是我始终尝试使用模式的“语言构建”实现,所以-请帮助我命名此结构.

这个想法接近于读者-作家模式.我们有一个“容器”,可以在其中通过键()添加对象.我们也可以通过键获取此对象,并将其从容器中删除.

因此,实现的类应具有两种方法:

void putObject(Key key, Object object);

Object getObject(Key key); // remove 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 savedObjects;

private final Map waitingConditions;

public BlackBoxImpl() {

this.savedObjects = new ConcurrentHashMap(20);

this.waitingConditions = new ConcurrentHashMap(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 {

}

解决方法:

我可能会使用类似

ConcurrentMap>.

使用Map的并发方法添加对.从您的队列中获取价值.使用ArrayBlockingQue(1).

大概是这样的:

static class MultiQueue {

// The base structure.

final ConcurrentMap> queues = new ConcurrentHashMap<>();

/**

* Put an item in the structure.

*

* The entry in the map will be created if no entry is currently there.

*

* The value will then be posted to the queue.

*/

public void put(K k, V v) throws InterruptedException {

// Make it if not present.

ensurePresence(k).put(v);

}

/**

* Get an item from the structure.

*

* The entry in the map will be created if no entry is currently there.

*

* The value will then be taken from the queue.

*/

public void get(K k) throws InterruptedException {

// Make it if not present - and wait for it.

ensurePresence(k).take();

}

private BlockingQueue ensurePresence(K k) {

// Make it if not present.

return queues.computeIfAbsent(k, v -> new ArrayBlockingQueue(1));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值