完成scala比赛

完成scala比赛,scala,concurrency,atomic,race-condition,concurrent.futures,Scala,Concurrency,Atomic,Race Condition,Concurrent.futures,我似乎找不到complete和tryComplete是否是Scala中承诺的原子操作。承诺只应该写一次,但是如果两个trycomplete在两个不同的回调中同时发生,那么会出什么问题吗?或者我们可以保证tryComplete是原子的吗?首先请注意,success(…)相当于调用complete(success(…),tryComplete(…)相当于complete(…)。isCompleted 文件上写着 如前所述,承诺具有单一赋值语义。因此,它们只能完成一次。对已经完成(或失败)的承诺调用s

我似乎找不到complete和tryComplete是否是Scala中承诺的原子操作。承诺只应该写一次,但是如果两个trycomplete在两个不同的回调中同时发生,那么会出什么问题吗?或者我们可以保证tryComplete是原子的吗?

首先请注意,
success(…)
相当于调用
complete(success(…)
tryComplete(…)
相当于
complete(…)。isCompleted

文件上写着

如前所述,承诺具有单一赋值语义。因此,它们只能完成一次。对已经完成(或失败)的承诺调用success将抛出非法状态异常

承诺只能完成一次。深入源代码,
DefaultPromise
扩展了
AtomicReference
(即线程安全),因此所有写入都是原子的。这意味着,如果您有两个线程完成了一个承诺,那么其中只有一个线程能够成功,并且将是最先成功的线程。另一个将抛出一个
非法状态异常

下面是一个小例子,说明当你尝试两次完成一个承诺时会发生什么

虽然很明显,人们可以通过做一些奇怪的演员特技来规避未来的不变性


人们可能应该避免这种情况。

承诺只完成一次;但也许你的意思是,如果T1尝试用一个长时间运行的计算来完成,那么T2尝试用一个快速值来完成(也许测试是完成的),T2会赢吗?显然,T2。因此,T1在进入tryComplete时不会“锁定”承诺。但是,不确定这是否是你的问题。@som snytt你的观点是额外的信息,这肯定很有趣。我只是想确定,如果T1和T2同时运行tryComplete,那么实际上只有一个成功了,另一个失败了,并且没有任何奇怪的事情发生。我不知道如何测试它,因为很明显我不能计时这样的事情。scaladoc出人意料地薄。而且我之前的推测也毫无意义:
Try{compute}
非常渴望并在交给
tryComplete
之前完成。对于completeWith来说,说同样的话并不那么有说服力:你不会期望第一个completeWith在下一个completeWith之前拍到它。