Java 具有最廉价性能的挥发物替代品

Java 具有最廉价性能的挥发物替代品,java,multithreading,concurrency,Java,Multithreading,Concurrency,我想实现通常的取消线程的协作机制。 然而,java内存模型仅在JDK5中修复,而我处于JDK5之前的环境中。 我理解,这意味着像SCIP所支持的那样做这样的事情是不正确的 class Worker implements Runnable { private volatile boolean _canceled; public void cancel() { _canceled = true; } public void run() { while( !

我想实现通常的取消线程的协作机制。 然而,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
        }
    }
}
我正在考虑使用一个原子布尔函数来封装_取消的变量。
还有其他选择吗?

我认为原子布尔在Java5之前也不可用。在私有布尔字段上进行同步怎么样?

AtomicBoolean
也添加到JDK5中,因此除非您使用。但是,是的,来自backport的atomic类可能是最佳选择,正如您所知,它是由精通JVM虚拟机规范每个版本的工作原理的人编写的。

(java.util.concurrent的前身)可能会有所帮助。

如果我理解正确,在旧的内存模型中,这不是一个问题,它允许对易失性字段进行重新排序。在他们的示例中,旧模型允许基于JVM的“x”为0或42。经验法则是,重新排序应该始终是编译器/cpu的性能增益,但程序员不能看到。旧模式打破了这条规则


您的示例不应该遇到可视性问题,并且可以正常工作。IIRC,非常旧的Sun JRE根本没有实现volatile。经过明智的尝试,旧JMM允许以这种方式使用挥发物(这是挥发物的唯一使用方式)。我知道Sun 1.4 JRE实际上实现了1.5 JMM,任何差异都被认为是bug。

问题的关键在于“最便宜的性能”。根据使用的是哪个JDK5之前的版本,同步可能会相对昂贵。我也是这样理解的。如果示例中的cancel()方法在设置_cancelled之前设置了其他一些(非易失性)字段,那么run()方法将不能保证在退出循环时看到该新值。但正如我所写的,这个例子是可行的。如果我告诉你我正在运行Java1.1,我会嘲笑你的痛苦,但我不会改变我的答案。看:你的是一个布尔值。只有不稳定的多头/双打是断开的,对吗?