软件事务内存导论(六)配置Akka事务
默认情况下,Akka为其相关的运行参数都设定了默认值,我们可以通过代码或配置文件akka.conf来更改这些默认设置。如果想了解如何指定或修改该配置文件位置的详细信息,请参阅Akka的文档。
针对单个事务,我们可以利用TransactionFactory在程序代码中更改其设置。下面就让我们用这种方式先后在Java和Scala中更改一些设置来为你展示如何实现设置的变更。
在Java中对事务进行配置
为了能够用编程的方式对事务进行配置,我们需要一个TransactionFactory实例对象,而TransactionFactoryBuilder则为我们提供了很多方便的函数用于创建该Factory。在上例中,我们创建了一个TranactionFactoryBuilder实例对象,并调用该对象的setReadonly()函数来为TransactionFactory添加readonly选项。由于TransactionFactoryBuilder实现了Cascade[1]设计模式,所以我们可以将更多用于改变事务属性的函数串在一起挂在TransactionFactoryBuilder构造函数之后、build()函数之前。随后我们把factory的实例对象作为Atomic的一个构造函数参数传给它,这样就保证了该事务内的所有操作都不会变更任何托管引用。
通过上述设置我们已经将readWriteCups()变成了一个只读事务,接下来你肯定希望了解在一个只读事务中试图改变引用的值将会产生什么后果。下面我们会调用两次readWriteCups(),第一次仅仅是读取cups引用的内容,而第二次调用则会尝试改变cups引用的值。
由于被设置成了只读,所以readWriteCups()事务不欢迎变更请求。于是当我们试图更改cups引用的值时,系统抛出了org.multiverse.api.exceptions.ReadonlyException异常,并且整个事务也将回滚。
Read only Attempt to write Failed org.multiverse.api.exceptions.ReadonlyException: Cant open for write transactional object akka.stm.Ref@1272670619 because transaction DefaultTransaction is readonly
上述运行时异常是在调用引用的swap()的时候抛出来的。该函数的作用是当且仅当新值与当前值不同时,将其引用改为指向新值的地址;否则,该函数将忽略变更请求。所以在本例中,如果我们在调用swap()时将参数20换成与当前cpus引用的值相等的24,则系统就不会抛出任何异常。
在Scala中对事物进行配置
在Scala中,我们可以使用atomic()函数代替Atomic类来创建事务,该函数在使用时需要一个TransactionFactory类型的可选参数。同时,由于我们能够在伙伴对象(companion object)上使用工厂方法,所以创建factory实例也比在Java中要简单许多。
除了在代码方面保持了Scala和Akka特有的简洁优雅之外,上述代码与Java版本就没有什么其他不同之处了,所以代码的执行结果也毫无意外地和Java版本完全相同。
Read only Attempt to write Failed org.multiverse.api.exceptions.ReadonlyException: Cant open for write transactional object akka.stm.Ref@1761506447 because transaction DefaultTransaction is readonly
[1]近些年来,特别是随着JVM上新语言的不断涌现,由Kent Beck所著的《Smalltalk Best Practice Patterns》[Bec96]一书中所讨论的一些设计模式又被重新发掘了出来。
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- Java内存模型FAQ(九)在新的Java内存模型中,final字段是如何工作的
- C++内存分配方式
- 汇编语言--寄存器(内存访问)
- linux 监控CPU 内存情况
- 查看linux系统版本、内存、CPU、存储容量
- Memcached缓存大数据时对服务器内存、CPU的影响及其对硬件的配置需求
- 利用S_MEMORY_INSPECTOR分析内存泄漏问题
- 使用 Chrome 开发者工具的 Memory 标签页分析内存泄漏问题
- Memcached缓存大数据时对服务器内存、CPU的影响及其对硬件的配置需求
- 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?
- 从缓冲池命中率角度判断自己的MYSQL数据库是否需要扩容内存
- jvm 内存分配性能提升之——逃逸分析与tlab
- 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )
- 002-JVM运行时数据区【内存模型、jvm参数配置】
- linux内存操作--ioremap和mmap学习笔记
- c#实现内存映射文件共享内存
- AVPacket相关api内存管理
- NameNode 需要多大的内存?
- pytorch 中如何减少内存占用?
- Android开发问题集锦五--OkHttp资源释放与内存泄露
- C++堆内存错误:CRT detected that the application wrote to memory after end of heap buffer