DOBON.NET DOBON.NETプログラミング掲示板過去ログ

共有ArrayListの競合回避方法

環境/言語:[WinXP VB.net2003]
分類:[.NET]

お世話に成ります。
ArrayListを共有する場合の競合回避方法に付いてお聞きします。

Collections.ArrayList.Synchronized(al) でラップされたArrayListを扱うメソッドでは同期処理をしなくても競合は発生しないのでしょうか?

例:
Public Class testArrayList
'このクラスは全て共有メソッドで作成。

'アレイリストの宣言
Public Shared al As New Collections.ArrayList
'同期されている (スレッド セーフな) ArrayList ラッパー
Public Shared Syncdal As Collections.ArrayList = Collections.ArrayList.Synchronized(al)

Public Shared Function addToTail(ByVal data As Test) As Boolean
'リストの末尾に追加する

'***alの扱い 同期処理が必要と思う**************************
'Monitor.Enter(al)
'Try
' al.Add(data)
' addToTail = True
'Catch ex As Exception
' addToTail = False
'Finally
' Monitor.Pulse(al)
' Monitor.Exit(al)
'End Try

'***Syncdalの扱い 同期処理はいらないのかな?***************
Try
Syncdal.Add(data)
addToTail = True
Catch ex As Exception
addToTail = False
MsgBox(ex.ToString)
End Try
End Function
End Class

宜しくお願いします。
「ArrayListを扱うメソッド」というより、「ArrayListのメソッドの呼び出し」という意味だと思いますが、そういうことであれば、その通りだと思います。(ArrayList.Addメソッドはスレッドセーフになりますので。)

私のメールマガジンでも多少説明しています。

.NETプログラミング研究 第26号
http://dobon.net/vb/melma/dotnet26.txt
有難う御座います。
> 「ArrayListを扱うメソッド」というより、「ArrayListのメソッドの呼び出し」という意味だと思いますが、そういうことであれば、その通りだと思います。(ArrayList.Addメソッドはスレッドセーフになりますので。)

おっしゃる事が理解できました。操作対象がスレッドセーフであれば、それを扱うメソッドでは同期処理は必要ないのですね。
今まで「競合」に付いて誤解していた様でメソッドばかりに目が行って、実はメソッドが扱う対象が問題となる事が今回解りました。

> 私のメールマガジンでも多少説明しています。
>
> .NETプログラミング研究 第26号
> http://dobon.net/vb/melma/dotnet26.txt

チェック不足で申し訳ありません、「.NETプログラミング研究 第26号」手元にあったのです実は・・・・・。dobonさんのメールマガジンはマルチスレッドのテキストにさせて頂いていたのです。
又宜しくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板