2009-11-28 57 views
0

如果我有一个方法Generator.cfc:ColdFusion中的线程安全序列号生成器?

numeric function next() 
{ 
    return variables.num++; // Is ++ an atomic operation?? 
} 

和:

application.generator = new generator(); 

如果每个请求调用application.generator.next(),这将永远发电机产生相同数量的两倍重物?换句话说......这是线程安全的吗?如果不是,锁应该放在哪里?

+0

相关博客文章:的线程安全性在ColdFusion中的整数计数器 - http://blog.bullamakanka.net/2010/01/thread-safety-of-integer-counters-in.html – Henry 2010-01-07 20:20:45

回答

4

通过将增量包装在锁中,可以使其成为原子。由于++需要三个操作(读取,添加,存储),我不认为它在任何平台上都是原子的。

+0

我认为你对'++'是正确的,但有原子的方式在某些平台上增加没有锁。例如,.NET上的“Interlocked.Increment”。如果Java有等价的话,可以直接调用它并避免锁定的性能影响。 – 2009-11-30 22:07:06

+0

我看到在评论之前我没有读得太远,Java确实有这样的构造,正如Bob指出的那样。 – 2009-11-30 22:08:18

3

是的,正如Donnie指出CFLOCK是你的朋友在这里。

5

你也可以考虑在Java 5类Atomic Integer

您所需要的ColdFusion代码是这样的(我没有测试过):

<cfset i = createObject("java", "java.util.concurrent.atomic.AtomicInteger").init(startValue) /> 
<cfset newValue = i.incrementAndGet() /> 
+0

不错,我喜欢这个! – Henry 2009-11-30 19:48:23