は、次のコードsnipetを考えてみましょう:てexecutor.executeは()JMM保証
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をインスタンスがそれを取得しようとする時間によってメッセージが含まれていることを保証しますか? JMMによれば、2つの関数呼び出しをJIT/JVMで並べ替えることはできますか?
Executor.execute()の関係が保証される前に、これが発生するドキュメントへの参照を提供してください.Javadocのhttp://download.oracle.com/javase/1 、5.0/docs/api/java/util/concurrent/Executor.html –
事実上の関係は文書化されていますが、Java 6から始まります。 "メモリ一貫性の影響:Runnableオブジェクトをエグゼクティブは、その実行が始まる前に、おそらく別のスレッドで発生します。 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executor.html ありがとう、Mr. Irreputable :) –