首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁定资源的时间不确定

锁定资源的时间不确定
EN

Stack Overflow用户
提问于 2013-08-14 19:31:57
回答 2查看 42关注 0票数 2

我的应用程序包含许多包含getter和setter的对象。这些对应于更改物理对象(例如,步进电机)的状态。其他线程可以调用此对象上的方法,以便对步进电机执行操作-这提供了步进电机和底层硬件之间的接口。因此,例如,我们可能有一个功能,使电机旋转15度,或者我们可能有一个功能,使它返回到空档位置。

现在,这些对象关心threadsafe,但这还不够好。考虑这样一种情况,其中一个线程试图将电机旋转90度(通过发出6个调用将电机旋转15度),然后在中途,另一个线程重置电机,这意味着它只移动了45度。

我的设计方案是允许控制对象取出控制器上的锁,但我不确定如何管理这一点。似乎大多数Java锁定方法都被设计为在单个方法调用上是原子的,在这种情况下,我希望锁定对象的时间不确定。

一个简单的Java锁就足够了吗,或者有没有人知道更好的方法?我担心的是,标准的ReentrantLock似乎几乎需要try-finally范式,这意味着我可能会在一定程度上把它搞得一团糟。

EN

回答 2

Stack Overflow用户

发布于 2013-08-14 19:48:36

您可以提供一种方法,以原子方式提交多个命令。假设您的所有方法都是同步的,那么它可能只是:

代码语言:javascript
复制
public synchronized void submitAtomically(List<Command> commands) {
    for (Command c : commands) {
        submit(c);
    }
}

public synchronized void submit(Command c) {
    //rotate or reset or ...
}

如果你不想让这些方法阻塞其他线程太长时间,最简单的方法是使用典型的生产者/消费者模式:

代码语言:javascript
复制
private final BlockingQueue<Command> queue = new LinkedBlockingQueue<> ();

public synchronized void submit(Command c) {
    queue.put(c);
}    

//somewhere else:

new Thread(new Runnable() {
    public void run() {
        while(true) {
            Command c = queue.take();
            c.execute();
        }
    }
}).start();

如果客户端通过submitAtomically提交6次轮换,则会阻止其他线程在6次轮换的中间插入其他命令。但是,submit操作非常快(它实际上并不执行命令),所以它不会长时间阻塞其他线程。

票数 1
EN

Stack Overflow用户

发布于 2013-08-14 20:34:32

在数据库世界中,这是通过拥有事务来实现的,这是一种将小的低级操作分组为原子的大的高级操作的方法。沿着这条路走下去将是相当痛苦的。

我认为你需要回去决定基本的原子操作是什么。

考虑这样一种情况:一个线程试图将电机旋转90度(通过发出6个调用将电机旋转15度),中途,另一个线程重置电机,这意味着它只移动了45度。

看起来您已经决定“旋转15度”是唯一的原子操作,但这显然不适合您的应用程序。

  • 你也需要“旋转45度”和“旋转90度”作为原子操作吗?也许您需要“旋转X度”,因为原子operation?
  • What的目的是将电机旋转到特定位置?如果线程A将电机旋转到位置X,然后线程B立即将其旋转到不同的位置,那么实现了什么?当电机在X位置时,是否需要(由线程A)执行某些操作?如果是这样的话,你希望旋转和那个操作一起成为一个原子操作。
  • ,为什么在执行操作之前将电机旋转给定的量?实际上,您是否希望在执行操作时电机处于特定位置(绝对位置,而不是相对于前一个位置)?在这种情况下,您不希望给您的操作提供旋转的数量,而是所需的位置。原子操作将由

负责决定电机旋转多少。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18230579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档