Java 保证订购的延迟锁定系统
Java是否有一个内置的锁定机制,其中一个“获取一个数字”(建立未来的锁定顺序),做一些工作,然后阻塞直到“现在服务”读取我们的票证号码 下面是我的意思的伪代码概述:Java 保证订购的延迟锁定系统,java,locking,Java,Locking,Java是否有一个内置的锁定机制,其中一个“获取一个数字”(建立未来的锁定顺序),做一些工作,然后阻塞直到“现在服务”读取我们的票证号码 下面是我的意思的伪代码概述: public CompletionStage<Void> onEvent() { return CompletableFuture.runAsync(() -> { // Establish future locking order without acquiring a lock int
public CompletionStage<Void> onEvent()
{
return CompletableFuture.runAsync(() ->
{
// Establish future locking order without acquiring a lock
int ticket = takeTicket();
// Execute network request asynchronously
return CompletableFuture.runAsync(() -> networkRequest(), threadPool).
thenCompose(() ->
{
// Trying acquiring a lock. If the locking system is
// waiting for someone with a smaller number, block
// until our turn comes up.
lock(ticket);
// ... do work that depends on strict event ordering ...
return CompletableFuture.runAsync(() ->
{
fireMoreEvents();
// Permanently discard the lock, allowing the next user to lock.
release(ticket);
}, eventDispatcher);
});
}, eventDispatcher);
}
public CompletionStage onEvent()
{
返回CompletableFuture.runAsync(()->
{
//在不获取锁的情况下建立未来锁定顺序
int ticket=takeTicket();
//异步执行网络请求
返回CompletableFuture.runAsync(()->networkRequest(),threadPool)。
然后撰写(()->
{
//正在尝试获取锁。如果锁定系统
//等待人数较少的人,封锁
//直到轮到我们。
锁(票);
//…执行依赖于严格事件顺序的工作。。。
返回CompletableFuture.runAsync(()->
{
fireMoreEvents();
//永久放弃锁定,允许下一个用户锁定。
放行(票);
},事件调度员);
});
},事件调度员);
}
- 票号必须按顺序处理
- 如果用户正在等待锁定,而持有当前票证的用户在
毫秒内未锁定和解锁,则抛出异常(以指示我有某种编程错误)超时
- 试图重用过期的票证(已使用或超时的票证)会引发异常
我有一个事件监听器,它必须按照接收的顺序记录事件,但它必须记录来自异步源(如网络)的相关信息以及数据。Yup。你能用一个蜘蛛来做这个吗?你能用示例代码发布一个答案吗?我在术语上看到了相似之处,当前的阶段号表示“正在服务”,但我看不出如何在注册时抓住“下一个数字”
register()
告诉我当前的阶段号,getRegisteredParties()
告诉我要添加多少,但后者不是线程安全的。我知道,一旦我有了注册号,我就可以使用waitadvance(int-phase)
等待它被调用。我是在检索getRegisteredParties()
时锁定某个数字,还是有更好的方法?@BoristSpider如果没有人在timeout
毫秒内声明下一个数字,我也不清楚如何强制锁前进到下一个数字,您是否要求严格的事件顺序在线程执行下一个任务之前以某种方式严格执行?我突然想到,将按顺序排列的事件放到阻塞队列中,然后让其他人处理它们,就可以给出顺序。将CompletableFuture
推送到takeTicket
中的队列上,并在lockTicket
中解析它-这将释放处理线程。处理线程可以get(timeout)
来处理推进。这样行吗?比与Phaser
@boristesspider斗争更简单我更新了问题,以澄清我想要将控制从线程A转移到线程B,然后再转移到线程A,同时保持与线程A运行时相同的顺序。您的解决方案(据我所知)的问题在于,您希望在第二次执行a
时,向takeTicket
传递CompletableFuture
。但是A
的第二次执行取决于B
生成的信息。所以我不能在a
第一次运行时构建一个CompletableFuture
。这意味着我无法在该点将CompletableFuture
推送到队列上。另外,发布一个正式的答案。非常感谢。