###実現したいこと
Scala初心者です。
現在、Scalaでの開発を行っているのですが、C#でのConcurrentDictionaryに相当するような(もしくはより良い)動作を必要としています。
Scalaでスレッドセーフなコレクションを扱いたい場合はどのようなクラス、コードにすればよいでしょうか?
ConcurrentDictionaryでの
- AddOrUpdate
- GetOrAdd
あたりの代替ができることと、
- Dictionary内の全要素の取得
ができることを期待しています。
###前提
- 該当のDictionaryには、多数のスレッドから頻繁な読み取りが発生する。
(ほとんどはキー指定での読み取り、まれに全データ一覧の取得)
- 更新は人間の認識できるレベルの頻度で発生。
- 削除はごく稀。
- 要素数は数百〜数万
###C#の場合のソースコード
C#の場合はこのようなコードを書いていました
C#
1private ConcurrentDictionary<string, MyClass> dic = new ConcurrentDictionary<string, MyClass>(); 2 3public void 更新メソッド(String id) { 4 5 (中略) 6 7 var item = dic.AddOrUpdate(id, 8 (k) => { 9 var newItem = new MyClass(); 10 (中略) 11 return newItem; 12 }, 13 (k, v) => { 14 (既存オブジェクトの更新処理) 15 return v; 16 }); 17 18 (中略) 19} 20 21public MyClass 取得メソッド1(string id) 22{ 23 return dic.GetOrAdd(id, 24 (k) => { 25 var newItem = new MyClass(); 26 (中略) 27 return newItem; 28 }); 29} 30 31public MyClass 取得メソッド2(string id) 32{ 33 MyClass item; 34 if (dic.TryGetValue(id, out item)) { 35 return item; 36 } else { 37 (見つからない場合の処理) 38 } 39}
###補足情報
Scalaバージョン:2.12.2
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/08 00:28