マルチスレッドプログラミングの発展に伴い、複数のスレッドが同じデータに同時にアクセスするという問題が発生しました。これにより、予測不可能なバグやプログラムの状態の破損が引き起こされました。
Visual Basic .NETでは、SyncLock構文を使用して排他ロックのメカニズムが適用され、同時に一つのスレッドだけが特定のコードを実行できることが保証されます。
解決策は、共有リソースにアクセスするコードの周りでSyncLock(またはMonitor.Enter/Exit)を使用し、クリティカルセクションの実行中にオブジェクトをロックすることです。
コード例:
Private Shared Counter As Integer = 0 Private Shared ReadOnly CounterLock As New Object() Public Shared Sub IncrementCounter() SyncLock CounterLock Counter += 1 End SyncLock End Sub
主な特徴:
Integer、String、またはNothingの値をロックトークンとして使用できますか?
いいえ、SyncLockには参照オブジェクトが必要です。文字列は推奨されませんが、内部的にインターンが行われ、暗黙のロック競合が発生する可能性があります。
異なるスレッドが同じ変数をロックするために異なるオブジェクトを使用した場合はどうなりますか?
同期は何も行われず、スレッドの競合が発生します — 厳密に同じオブジェクトをロックする必要があります。
SyncLockブロックから出た後に手動でロックを解除する必要がありますか?
いいえ、ブロックを出るときに自動的にロック解除が行われます。例外が発生した場合でも同様です。
コード内でSyncLockに文字列を使用し、プログラムの複数部分が同じ文字リテラルを使用しています。その結果、異なるロックが交差し、予期しないデッドロックが発生します。
利点:
欠点:
各クリティカルセクションに対して別のReadOnlyオブジェクトを宣言します。本当に必要なコードの最小部分だけをロックします。
利点:
欠点: