【发布时间】:2009-11-28 13:54:38
【问题描述】:
我们有一组操作或“作业”,我们希望一次发生一个(而不是同时发生)。即:作业 A 不能在 B 发生时发生,并且您不能同时运行两个 C 作业。
如果一个线程尝试同时运行一个作业,它们应该会得到一个错误。我们不应该只是排队请求。
有些工作是在用户发出请求时异步发生的,我们返回一个状态消息和 id,然后在服务器上异步处理工作。
我们正在寻求有关如何处理这种情况的建议。
一个选项是lock on a shared object:
public class Global {
public static final Object lock = new Object();
}
public class JobA {
public void go() {
synchronized(Global.lock) {
//Do A stuff
}
}
}
public class JobB {
public void go() {
synchronized(Global.lock) {
//Do B stuff
}
}
}
这个问题:
- 我们会将并发请求排队并且不返回错误消息(我们想要这样做)
- 如果
JobA想将消息写入队列进行异步处理,如何保证当JobA中的另一个方法从队列中读取消息时,该方法能够获取到@987654325 @lock 在另一个JobA实例启动之前?
对更好的方法有什么建议吗?
【问题讨论】:
-
如果你解释一下 A. B. 和 C 的实际作用,可能会更容易理解。
标签: java concurrency synchronization