scala – 管理可变状态的最佳方法是什么?
我刚刚在Coursera完成了Martin Odersky的
scala课程.
Scala是我的第一个FP语言,我对限制可变状态的想法很兴奋.这允许更容易的并发性并且还使代码超级可维护.
在学习所有这些的同时,我意识到你可以保证对象的可变性,只要它没有可变变量并且只引用了不可变对象.所以现在我可以通过创建一个新状态而不是修改旧状态来做任何事情,尽可能使用尾递归. 大.所以我到目前为止只能做到这一点.在某些时候,我的应用程序需要能够修改一些现有的状态.我知道在这一点上放入并发控制的地方,锁定,等等等等.我仍然默认使用我一直使用的标准多线程并发控制. 哦斯卡拉社区,还有更好的方法吗?莫纳德也许? 编辑:这个问题有点笼统,所以我想给一个用例: 解决方法
这是一个主观问题,所以我不会试图回答“哪个是最好的”部分.如果您的主要关注点是多线程并发环境中的状态,那么一个选项可能是
Software Transactional Memory.
有一个0700(参见快速入门)STM由Akka提供.根据您的使用情况,它可能是重量级或过度杀伤,但是再次,它可能比一堆锁更好.与锁不同,STM往往是乐观的,与数据库事务的方式相同.与数据库事务一样,您可以在事务上下文中显式更改共享状态,并且如果检测到冲突,您将以原子方式提交或重新尝试更改.基本上你必须在Refs中包装你的所有状态,只能在’原子’块中操作 – 实现为一个方法,它采用一个闭包,你在其中使用操作你的Refs和ScalaSTM确保你所在州的整套操作要么成功还是失败 – 没有中途或不一致的变化. 这利用了Scala的隐式参数 – 对Refs的所有操作都需要一个事务对象作为参数,这是由给予atomic的闭包接收的,并且可以声明为隐式,因此原子内的所有代码都可以用非常自然而安全的方式编写样式. 为了实现这一目标,您需要使用提供的事务数据结构;这意味着使用TSet而不是Set,TMap而不是Map.当在事务上下文中(在原子块内)使用时,它们提供全有或全无的更新语义.这非常像clojure的持久集合.您还可以使用Refs构建自己的事务数据结构,以便在这些原子块中使用. 如果你不反对括号,refs的clojure解释真的很好:http://clojure.org/refs (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |