gpt4 book ai didi

java - JAVA通过并发在静态方法中实现唯一ID号

转载 作者:行者123 更新时间:2023-11-29 08:42:53 24 4
gpt4 key购买 nike

每次调用方法时,我都想从我的域对象(表)ID 中获取唯一 ID。这样 ID 就不会重复。我有一个返回唯一 ID 的函数。

public static Long generateID (Short company)
throws Exception
{
IDDAO iDDAO = SpringApplicationContext.getBean (IDDAO.class);
ID iD = iDDAO.findByNaturalKey (new IDNatKey (company);

if (iD != null)
{
// Check if ID has reached limit, then reset the ID to the first ID
if (iD.getLatestIDno ().longValue () == iD.getLastIDno ().longValue ())
{
iD.setLatestIDno (iD.getFrstIDno ());
}

// Get next ID
iD.setLatestIDno (iD.getLatestIDno () + 1);
// update database with latest id
iDDAO.update (iD);

return iD.getLatestIDno ();
}
}

问题是,如果从两台机器访问应用程序并同时从 UI 按下按钮以生成 ID,则此方法有时会返回重复的 ID

例如

Long ID = TestClass.generateID (123);

这有时会让我重复。

我是这样制作的

public static synchronized Long generateID (Short company)
throws Exception

这样一次只有一个线程可以进入这个函数,但是重复的问题仍然存在。

我不想使用数据库序列,因为如果事务回滚,我不想在 ID 序列中出现空隙,在那种情况下,序列仍将递增,这是我不想要的。中间的空隙是可以的,但不是最后。例如,我们有 1、2 和 3 作为 ID,2 回滚,这样就可以了。但是如果3回滚了,当另一个用户来的时候我们应该重新得到3,如果顺序的话,它会给出4

请帮我看看我做错了什么? static synchronized 仍会导致其他线程同时进入此函数吗?我在类里面还有许多其他静态(但不是同步)函数。如果我将其设置为静态同步,这也会对他们造成问题吗?

谢谢

艾登

最佳答案

您可以使用 java.util.UUID。它将生成一个通用的 uniqueId。

关于java - JAVA通过并发在静态方法中实现唯一ID号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38912565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com