次のコード スニペットを検討してください。
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 によって 2 つの関数呼び出しを並べ替えることができますか?