可变参数线程安全的静态方法?

时间:2016-04-28 05:16:49

标签: java multithreading thread-safety

我有一个方法

public static Person updatePersonId (Person person)
{
    // If the ID of the person reaches the maximum ID in our predefined range in configuration then reset the ID from the start otherwise it will cross the range we defined.
    if (person.getNewID ().longValue () == person.getLastPossibleID ().longValue ())
    {
        person.setNewID (person.getFirstID ());
    }

    // add 1 to Old ID to get new ID
    person.setNewID (person.getNewID + 1);

    return person;
}

我使用hibernate将其更新为数据库。

正如您所看到的,我在数据库中不能有多个具有相同ID的人(因为我们总是在其先前的ID中添加1)。

现在的问题是,当我同时运行我的应用程序,即同时运行两个事务时,分配给人的ID有时会变成副本。

Database row

PersonID        PersonName

  1                  Bob
  2                  Robert
  2                  Daniel

我创建的方法是不是线程安全的?我可以添加Synchronized关键字吗?

1 个答案:

答案 0 :(得分:1)

是的,这种方法不是线程安全的。因为,两个线程可以同时到达该行: -

person.setNewID (bnkPrb.getNewID + 1);

然而,同步整个方法会降低代码的速度,因此只需要锁定此行: -

public static Person updatePersonId(Person person) {     //如果此人的ID在配置中达到我们预定义范围内的最大ID,则从头开始重置ID,否则它将越过我们定义的范围

if (person.getNewID ().longValue () == person.getLastPossibleID ().longValue ())
{
    person.setNewID (person.getFirstID ());
}

// add 1 to Old ID to get new ID
syuncronized(this){
person.setNewID (bnkPrb.getNewID + 1);
}


return person;
} 

但是,在数据库端自动增加列或序列的最佳方法。