我有不同的线程,我想从中调用一个函数,该函数通过查找当前最高 ID、增加它并将新对象(具有增加的 ID)插入列表中来将元素添加到列表中。
我是否需要关心,当两个线程同时调用该函数时,两个对象将具有相同的 ID 还是 JVM 会处理这个问题
如果您使用 ++ 或 += 1 之类的操作,则这些操作需要多个步骤才能工作,并且如果这些步骤与该字段上的另一个线程调用的操作交织在一起,则这些线程可能会干扰 esch other 并且该字段可能会获得一些意外的值.
此外,查找最高 id 并在列表中插入新值的过程也不是您希望其他线程干扰的。您需要在找到高值之前获取锁并保持它直到您完成插入新条目。
如果您使用 Atomic 类,则它们的方法不会受到干扰(这就是 Atomic 的意思)。使用 AtomicLong.incrementAndGet() 将导致每次调用返回下一个 long 值。
最好使用原子变量或数据库序列,而不是反复搜索最高 id(并且必须锁定)。在使用方法生成 id 的应用程序中,id 生成可能是一个瓶颈。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句