Java提供了一个通用的.reduce(identity, accumulator)方法。
从javadocs中可以很清楚地看出,累加器应该是一个无状态函数。
但是,我有一个关于identity对象的问题,即它应该是线程安全的吗?
让我们假设一个identity是一个java对象,而一个accumulator以一种非原子化的方式修改这个对象,例如accumulator查看identity's状态,然后决定如何精确地修改它的内部状态。很明显,可能会发生多个精简操作同时运行的情况。在这种情况下,出现了几个问题:
identity对象作用域中的原子操作吗?identity对象不可变并在每个identity对象上返回一个新实例?发布于 2021-02-22 16:38:04
这是文档所涵盖的,但不是直接的,而是隐含的。
标识值必须是累加器函数的标识。这意味着对于所有的t,accumulator.apply(恒等式,t)等于t。
就像您说的那样,一旦identity被修改,即使是以线程安全的方式,上面的规则也会被违反;因此无法保证预期的结果。
对于第二个问题,答案涉及得更多一些。您不必使identity不可变,只要没有人滥用它(通过修改它的内部状态)。当然,immutable在这方面有很大的帮助。
https://stackoverflow.com/questions/66318158
复制相似问题