如何编写在实体实例上同步的Java代码

时间:2014-01-21 16:21:40

标签: java multithreading hibernate

我正在使用Hibernate和Spring,我想编写服务代码以满足以下情况:在两个单独的线程中,DAO用于通过id获取实体实例,并且它是相同的在每种情况下都是id / database行,我不希望给定的方法在该实体实例的两个线程中并发运行。

我不确定是否可以写...

synchronized(entity) {}

或者这是否可行,因为从DAO检索时,每个线程都可能在内存中创建了对象的不同实例,两者都引用了同一个实体实例。

如果Hibernate确实可以在内存中为同一个实体实例创建多个对象,那么做我想做的事情的最佳方法是什么?

1 个答案:

答案 0 :(得分:5)

那不行。当您从数据库加载数据时,Hibernate可能(并且经常会)返回不同的实例。

原因是两个线程可能想要同时访问同一个对象。如果Hibernate同时给出相同的实例,那么一个线程的更改可能(或不)对第二个线程可见。

要实现您的目标,您需要一个中央注册表,您可以通过ID获取实体的锁定。这样,每个线程都可以:

 Object lock = lockFactory.getLock(id);
 synchronized(lock) {...}

然后,您的工厂可以确保所有线程获得相同ID的相同锁定。