TRef[A] 是可以参与 STM 事务的对不可变值的可变引用。其可变引用可以在事务内检索和设置,并被强制保证原子性,一致性并与其他事务的隔离。 TRef 在 STM 内存中发生改变时,使用了低级机制来创建事务。 创建一个 TRef 在事务内部创建TRef: 或者在事务内创建一个TRef,然后立即提交该事务,这使您可以存储并传递一个值引用。 从 TRef 中取出值 从一次事务中取回结果值: 或多次事务提交后取回值: 给 TRef 设置一个值 设置该值将覆盖现的引用内容。 在单个交易中设置值: 或(在)多次交易(中多次设置): 更新 TRef 中的值 update(A => A) 函数允许根据 TRef 中旧的值计算新的值。 在单次事务中更新值: 或(在)多次事务(中多次更新): 修改 TRef 中的值 modify(A => (B, A)): B 函数和 update 相似,但是它允许返回一些(B 类型的)信息。 在单个事务中修改值: 或(在)多次事务(中多次修改): 使用例子 这是使用 TRef 在两个纤程之间传递值的例子: 在此示例中,我们为发送者和接收者创建并提交两个事务引用,以便能够提取它们的值。在接下来的步骤中,我们创建一个原子事务,仅在发送者帐户中有足够的可用余额时才更新两个帐户。然后,我们(fork)以异步运行它。在接下去的纤程中,我们暂停它的执行直到发件人余额发生变化(在这种情况下达到零为止)。 最后,我们提取两个帐户的新值并将其合并为一个结果。 ZTRef 和 Ref[A] 类似,TRef[A] 实际上是 ZTRef[+EA, +EB, -A, +B] 类型的别名, ZTRef[+EA, +EB, -A, +B] 是一个多态的事务性引用,支持 ZRef 所提供的所有运算。有关多态引用的更多讨论,请参见 ZRef.