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

Runnable インスタンスがメッセージを取得しようとするまでに、messageQueue にメッセージが含まれていることが保証されていますか? または、もう少し一般的な言い方をすると、JMM に従って JIT/JVM によって 2 つの関数呼び出しを並べ替えることができますか?

4

1 に答える 1

4

はい、他の生産者/消費者がいない場合。

Executor.execute()事前発生関係を確立します。したがって、すべてoffer() が事前発生し poll()ます。poll()の効果が見られoffer()ます。正式には指定されていませんが、常識的にpoll()は、キューに追加されたばかりのオブジェクトを返す必要があります。

于 2011-11-16T05:36:38.803 に答える