Executor.execute()JMM保证

时间:2011-11-16 05:10:48

标签: java concurrency java-memory-model

考虑以下代码snipet:

public class A {

    private final Executor executor = Executors.newCachedThreadPool();
    private final Queue<Object> messageQueue = new ConcurrentLinkedQueue<M>();

    public void sendMessage(Object message) {
        messageQueue.offer(message);
        executor.execute(new Runnable() {
            @Override
            public void run() {
                final Object message = messageQueue.poll();

                // Can message == null? 
            }
        });
    }
}

在Runnable实例尝试检索消息时,是否保证messageQueue包含消息?或者说它更通用一点:根据JMM,JIT / JVM可以重新排序两个函数调用吗?

1 个答案:

答案 0 :(得分:4)

是的,如果没有其他生产者/消费者。

Executor.execute()建立一个发生之前的关系。因此offer() 中的所有内容都发生在 poll()之前。 poll()看到了offer()的效果。虽然没有正式指定,但根据任何常识,poll()应该返回刚刚添加到队列中的对象。