考虑以下代码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可以重新排序两个函数调用吗?
答案 0 :(得分:4)
是的,如果没有其他生产者/消费者。
Executor.execute()
建立一个发生之前的关系。因此offer()
中的所有内容都发生在 poll()
之前。 poll()
看到了offer()
的效果。虽然没有正式指定,但根据任何常识,poll()
应该返回刚刚添加到队列中的对象。