Java-Grails上的同步块可在Windows上运行,但在Linux中无法

我有一个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.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...