我计划编写一个序列生成器,用于在我的REST资源实现类中进行POST操作时生成唯一的ID。由于每个POST请求都由单独的线程处理,因此我将变量设置为volatile并使方法同步。我没有使用传统关系型数据库提供的序列或其他选项。
public class SequenceGen {
volatile static int n = 0;
public synchronized int nextNum(){
return n++;
}
}
这是我迄今为止所做的,我计划在我的REST实现中创建一个名为SequenceGen的变量。我的实际问题是,它会在某个地方出错吗?我使用了两个线程进行测试,我没有看到任何重复的值。
nextNum
方法设置为static
以确保它的正确性。 - BrajAtomicInteger
? - fgevolatile
是多余的,因为你使用同步方法来访问它。但我同意 fge 的观点:AtomicInteger
是更好、更安全、更快速的解决方案。如果你计划有多个虚拟机,应该考虑使用 UUID(但你会得到一个字符串而不是整数)。 - JB Nizet++
操作符会做一个读取,然后增加它的值,接着再写入。这个操作序列不是原子性的。因此两个线程可能会并行地读取相同的值,增加它,并并行地写入下一个相同的值。这就是为什么有AtomicInteger.incrementAndGet()
存在的原因。 - JB Nizet