0

考虑以下代码片段:

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? 
            }
        });
    }
}

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

4

1 回答 1

4

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

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

于 2011-11-16T05:36:38.803 回答