Java-Grails上的同步块可在Windows上运行,但在Linux中无法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java-Grails上的同步块可在Windows上运行,但在Linux中无法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1450字,纯文字阅读大概需要3分钟。
内容图文
![Java-Grails上的同步块可在Windows上运行,但在Linux中无法](/upload/InfoBanner/zyjiaocheng/950/c6aad528e113408485ed3cdd6ff05936.jpg)
我有一个grails应用程序,它依赖于服务中的同步块.当我在Windows上运行它时,同步按预期方式工作,但是当我在ams linux上运行时,获取StaleObjectStateException.
在下面的示例中重现该问题.
class TestService {
private final Object $lock = new Object[0];
TesteSync incrementa() {
synchronized ($lock) {
TesteSync t = TesteSync.findById(1)
t.contador++
t.save(flush: true)
Thread.sleep(10000)
return t
}
}
}
据我了解,发生此异常是因为多个线程试图保存同一对象.这就是为什么我使用同步块.
Linux Java:
> Java版本“ 1.7.0_85”
> OpenJDK运行时环境(amzn-2.6.1.3.61.amzn1-x86_64 u85-b01)
> OpenJDK 64位服务器VM(内部版本24.85-b03,混合模式)
Windows Java:
> Java版本“ 1.7.0_79”
> Java(TM)SE运行时环境(内部版本1.7.0_79-b15)
> Java HotSpot(TM)64位服务器VM(内部版本24.79-b02,混合模式)
有什么线索吗?
谢谢
解决方法:
您为什么要获取StaleObjectStateException是正确的.
如果您要查找的是悲观锁定(在任何给定时间仅允许一次事务访问数据),则可以使用域类lock()方法:
class TestService {
static transactional = true
TesteSync incrementa() {
TesteSync t = TesteSync.lock(1)
t.contador++
return t.save()
}
}
您可以了解有关Grails悲观锁定here的更多信息.
PS:默认情况下,Grails服务是事务性的.但是在我的示例中,我明确地使该服务成为事务性的,以引起您的注意:Grails会自动释放该锁when the transaction commits.我还删除了刷新,因为在提交事务时会刷新数据.如果从未显式设置为@Transactional的控制器方法执行此操作,则需要刷新.
提示:通过ID查询时,您可以执行此操作…
SomeDomainClass.get(1)
而不是这个
SomeDomainClass.findById(1)
Espero que ajude.
内容总结
以上是互联网集市为您收集整理的Java-Grails上的同步块可在Windows上运行,但在Linux中无法全部内容,希望文章能够帮你解决Java-Grails上的同步块可在Windows上运行,但在Linux中无法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。