考虑下面的代码片段:
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包含该消息?或者更通用一点:根据JMM,JIT/JVM可以对两个函数调用进行重新排序吗?
发布于 2011-11-16 13:36:39
是的,如果没有其他生产者/消费者的话。
Executor.execute()建立一种先发生后发生的关系。因此,在poll()之前,offer()中的一切都会发生。poll()看到了offer()的效果。尽管没有正式指定,但从任何常识来看,poll()都应该返回刚刚添加到队列中的对象。
https://stackoverflow.com/questions/8147015
复制相似问题