1

MS リファレンス: http://msdn.microsoft.com/en-us/library/3a86s51t(v=vs.71).aspx

「SyncLock ステートメントの式の型は、クラス、モジュール、インターフェイス、配列、デリゲートなどの参照型でなければなりません。」

シナリオ: 複数のスレッドがリストを読み取り、編集しています。

これにより競合状態が回避されることはわかっています。

SyncLock TheList
TheList.item(0) = "string"
End SyncLock

しかし、これでしょうか?

SyncLock TheList.item(0)
     TheList.item(0) = "string"
End SyncLock
4

1 に答える 1

0

いいえ、2 番目のスニペットは根本的に間違っています。ロックオンするオブジェクトを交換しているためです。したがって、別のスレッドが別のオブジェクトのロックを取得するため、スレッドセーフはまったくありません。ロックは、スレッドがまったく同じオブジェクトを使用してロック状態を保存する場合にのみ機能します。

ロックする対象の種類も注目に値します。2 番目のスニペットは、インターンされた文字列に対して行います。デッドロックを引き起こす可能性が非常に高いため、非常に悪いです。他の場所の他のコードも同じように間違っている可能性があり、文字列リテラルをロックすることもあります。それがたまたま「文字列」でもある場合、完全に診断不能なデッドロックが簡単に発生します。

また、最初のスニペットの問題である、おそらく公開されているため、他のコードが TheList オブジェクトをロックしている可能性があります。同じ理由でデッドロックが発生します。ボイラープレートは、常に専用のオブジェクトを使用してロック状態を保存することです。このオブジェクトは、他の目的には使用されず、リストにアクセスするコードにのみ表示されます。

 Private ListLock As Object = New Object
于 2013-06-24T13:52:19.567 に答える