我正在使用Hibernate和Spring,我想编写服务代码以满足以下情况:在两个单独的线程中,DAO
用于通过id获取实体实例,并且它是相同的在每种情况下都是id / database行,我不希望给定的方法在该实体实例的两个线程中并发运行。
我不确定是否可以写...
synchronized(entity) {}
或者这是否可行,因为从DAO
检索时,每个线程都可能在内存中创建了对象的不同实例,两者都引用了同一个实体实例。
如果Hibernate确实可以在内存中为同一个实体实例创建多个对象,那么做我想做的事情的最佳方法是什么?
答案 0 :(得分:5)
那不行。当您从数据库加载数据时,Hibernate可能(并且经常会)返回不同的实例。
原因是两个线程可能想要同时访问同一个对象。如果Hibernate同时给出相同的实例,那么一个线程的更改可能(或不)对第二个线程可见。
要实现您的目标,您需要一个中央注册表,您可以通过ID获取实体的锁定。这样,每个线程都可以:
Object lock = lockFactory.getLock(id);
synchronized(lock) {...}
然后,您的工厂可以确保所有线程获得相同ID的相同锁定。