2017-05-30 63 views
0

我有不同的线程,我想从中调用一个函数,该元素通过查找当前最高ID,递增它并插入新对象(与递增的ID)放入列表中。Java:线程:添加具有ID的元素以从不同线程列出

我一定要关心的是,当两个线程调用函数在同一时间,两个对象将具有相同的ID或不如果你使用像++或操作JVM利用这个

+2

请向我们展示如何访问列表并确定最高ID。根据目前的信息,我会说是的,你必须照顾。 –

+1

你肯定会'关心'。这可以很容易地以产生具有相同值的多个id的方式来实现。 – matt

回答

1

护理+ = 1,那些需要多个步骤才能工作,并且如果这些步骤与该字段上的另一个线程调用的操作交错,则这些线程可能会干扰其他线程,并且该字段可能会获得一些意想不到的值。

此外,查找最高ID并在列表中插入新值的过程不是您想要被其他线程干扰的过程。在找到高价值之前,您需要先获取一个锁定,然后等到完成插入新条目后再进行锁定。

如果你使用原子类,他们的方法不会受到干扰(这就是原子的意思)。使用AtomicLong.incrementAndGet()将导致每次调用返回下一个长整型值。

使用原子变量或数据库序列比混乱搜索最高的id(并且必须锁定)要好。在使用方法来生成您所描述的id的应用程序中,id生成可能是一个瓶颈。