gpt4 book ai didi

java - 锁定资源一段不确定的时间

转载 作者:行者123 更新时间:2023-11-30 11:29:38 24 4
gpt4 key购买 nike

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

现在,这些对象关心线程安全,但这还不够好。考虑这样一种情况:一个线程试图将电机旋转 90 度(通过发出六个调用以旋转 15 度),但在进行到一半时,另一个线程重置了电机,这意味着它只移动了 45 度。

我的设计解决方案是允许控制对象取消对 Controller 的锁定,但我不确定如何管理它。似乎大多数 Java 锁定方法都设计为在单个方法调用上是原子的,我希望在不确定的时间内锁定对象。

一个简单的 Java 锁是否足以满足此目的,或者有人知道更好的方法吗?我担心标准的 ReentrantLock 似乎几乎需要 try-finally 范式,这意味着我可能会在一定程度上破坏它。

最佳答案

您可以提供一种方法来自动提交多个命令。假设您的所有方法都是同步的,它可能只是:

public synchronized void submitAtomically(List<Command> commands) {
for (Command c : commands) {
submit(c);
}
}

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

如果您不希望这些方法阻塞其他线程太久,最简单的方法是使用典型的生产者/copnsumer 模式:

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 操作非常快(它实际上并不执行命令)所以它不会长时间阻塞其他线程。

关于java - 锁定资源一段不确定的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18230579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com