私はJavaでコードの並べ替えや競合条件について質問します。 Lockは出来上がる関係を保証しますか?
は2つの以上のスレッドが同時にworkForThread()
を実行すると、私は次のコードがあるとします。
public class Job {
private Lock lock = new ReentrantLock();
private int sharedObject = 1;
public void workForThread() {
lock.lock();
try {
sharedObject++;
} finally {
lock.unlock();
}
}
}
それはJVMが間違った順序でこれを実行することができることは可能ですか?たとえば、次の並べ替えが可能ですか?
sharedObject++;
lock.lock();
lock.unlock();
または、ロックの順序が変更されないことは保証されていますか?
一般に、JVMは、リオーダリングが「最終的な一貫性」につながり、パフォーマンスを向上させることが判明した場合、メモリバリア命令間の命令を並べ替えることができます。並べ替えによって最終的な整合性が得られない場合、JVMは命令の順序を変更しません。 – TheLostMind
関連:http://stackoverflow.com/questions/2576443/java-memory-model-reordering-and-concurrent-locks?rq=1 – Thilo
@Ryu「Lock」のインスタンスを作成することはできませんインタフェース。私は 'ReentrantLock'やその他のロックインターフェース' Lock'の実装をインスタンス化することを意図していたと思いますか?そうでない場合は、あなたの 'Lock'実装の様子を見せてくれますか? – CKing