【发布时间】:2014-04-20 10:37:00
【问题描述】:
我打算编写一个序列生成器,它将被使用 在发布期间在我的 REST 资源实现类中生成 唯一身份。由于每个 post 请求都由单独的线程处理, 我使变量 volatile 和方法同步。 我没有选择使用序列或其他东西 传统的 RDBMS 提供。
public class SequenceGen {
volatile static int n = 0;
public synchronized int nextNum(){
return n++;
}
}
这是我目前所拥有的,并计划创建一个变量 我的 REST 实现中的 SequenceGen。我的实际问题是意志 它在某处断裂?我用两个线程测试,我没有看到 任何重复的值。
【问题讨论】:
-
制作
nextNum方法static以确保它。 -
如果您的初始测试显示它有效并且您的逻辑表明它应该有效,通常您不应该再担心它并接受它(目前)有效。当它真正造成问题时,请担心它。
-
为什么不直接使用
AtomicInteger? -
您的进程涉及多个 jvm?在您的 POC 中,我想您使用的是单个 jvm。
-
该字段应该是私有的。 volatile 是多余的,因为您使用同步方法访问它。但我同意 fge:AtomicInteger 是一种更好、更安全、更快的解决方案。如果您计划拥有多个虚拟机,则应考虑使用 UUID(但您将获得 String,而不是 int)
标签: java multithreading sequence