次のサンプルコードがあるとします。
while(some condition){
lock1.lock();
.
.
}
質問は:
このコード部分を実行する一部のスレッドでwhileループの状態が終了し、lock1が使用可能であるとすると、スレッドはループの状態をチェックしますが、それでもロックを取得できない可能性はありますか?
または、この場合、条件がチェックされた場合、スレッドがロックを取得することが保証されていますか?
次のサンプルコードがあるとします。
while(some condition){
lock1.lock();
.
.
}
質問は:
このコード部分を実行する一部のスレッドでwhileループの状態が終了し、lock1が使用可能であるとすると、スレッドはループの状態をチェックしますが、それでもロックを取得できない可能性はありますか?
または、この場合、条件がチェックされた場合、スレッドがロックを取得することが保証されていますか?
要するに:はい、それは可能です。
別のスレッドがすでにロックを取得している場合、スレッドはロックが解放されるのを待つように強制されます。
同時に実行されている2つ以上のスレッドが、命令の実行をどのようにインターリーブするかを知る方法がないことを忘れないでください。AとBの2つのスレッドを想定して、このコードを実行します。スレッドAが条件を真と判断した場合、実際にロックを取得する前に(つまり、while条件の評価とからの呼び出しの間に)プリエンプションされる(OSスケジューラによってCPUが削除される)可能性があるlock()ため、スレッドBも条件を検出します。条件が真の場合、ロックが取得され、スレッドAは待機状態になります。
他のスレッドによって変更可能な条件に基づいてロックを作成しないでください。このような条件は、ロック内のコードに影響を与える可能性があります。ロックを取得する前に状態が変化しないという保証はありません。