【发布时间】:2015-10-28 09:31:12
【问题描述】:
我有一个 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,混合模式)
有什么线索吗?
谢谢
【问题讨论】:
-
只是猜测,也许什么都不会改变:你也可以试试installing the Oracle JDK on linux 吗?
-
您错过了 InterruptedException 的 try catch 或 throws
-
你确定你只有一个
TestService的实例吗? -
@RealSkeptic Spring 应该确保服务是 grails 架构下的单例。但无论如何我都会验证
-
@BackSlash 我也试试 Oracle JDK
标签: java linux windows grails synchronized