我想实现用于取消线程的常用协作机制。然而,java内存模型只有在我处于JDK5之前的环境中时才在JDK5中修复。我理解,这意味着像SCIP中支持的那样做这样的事情是不正确的。
class Worker implements Runnable
{
private volatile boolean _canceled;
public void cancel() { _canceled = true; }
public void run() {
while( ! _canceled )
{
// do my Stuff
}
}
}我正在考虑使用AtomicBoolean来封装_canceled变量。还有别的选择吗?
发布于 2009-04-01 02:08:00
JDK5中也添加了AtomicBoolean,因此除非您使用的是backport,否则此功能不可用。但是,是的,来自后端的原子类可能是最好的选择,因为您知道它是由精通JVM虚拟机规范的每个版本的工作原理的人编写的。
发布于 2009-04-01 04:18:52
如果我正确理解了FAQ,这在旧的内存模型中不是问题,旧的内存模型允许重新排序易失性字段。在他们的示例中,基于JVM,旧模型将允许"x“为0或42。经验法则是,重新排序应该始终是编译器/cpu的性能提升,但对程序员来说是不可见的。旧的模型打破了这条规则。
您的示例应该不会遇到这种可视性问题,并且可以正常工作
发布于 2009-04-01 02:25:58
util.concurrent package by Doug Lea ( java.util.concurrent的前身)可能会有所帮助。
https://stackoverflow.com/questions/703794
复制相似问题