我在 Code Review 论坛上问了一个类似的问题,但有人建议在这里问这个问题。我想知道synchronized
下面的网络方法中的关键字。由于setPerson
是从线程池调用的(意味着不同的线程可以调用它),我应该以某种方式同步它。当我的客户端对该方法进行 SOAP 调用时,EclipseLink 会使用 thead 池。我的问题是,制作 web 方法是否是一种好习惯,synchronized
或者我可以与之同步em.lock(person, WRITE)
吗?
@Override
public synchronized void setPerson(Person person) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersonLibPU");
EntityManager em = emf.createEntityManager();
if(!em.getTransaction().isActive()) {
em.getTransaction().begin();
}
try {
person.setPersonId(getLastInsertedId() + 1); // Get the last inserted ID and increment it by 1
em.merge(person);
em.getTransaction().commit();
emf.getCache().evict(Person.class);
} catch (Exception ex) {
if(em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
}
编辑
我在上面的代码中添加了一行,在其中设置了 person 对象的主键值。这就是同步的目的,而不是任何共享的 java 对象。我需要同步它,这样两个线程就无法获得相同的主键。