質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Q&A

1回答

2309閲覧

Scalaでのスレッドセーフなコレクションについて

ntkkni31

総合スコア15

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

0グッド

0クリップ

投稿2017/05/03 12:32

###実現したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

scala.collection.mutable.SychronizedMapトレイトが該当するかと思います。GetOrAdd相当はgetOrElseUpdateになります。

しかし、SychronizedMapトレイトはScala 2.11.0からdeprecatedになっており、java.util.concurrent.ConcurrentHashMapクラスを代わりに使うようにドキュメントにはあります。ConcurrentHashMapクラスであれば、putIfAbsentが該当のメソッドになります。

スレッドセーフな処理はどうしても重くなりますので、速度に問題が出る場合は、immutableなデータとして扱うように根本から設計し直す、外部データベースを使う等を検討する必要があるかもしれません。

投稿2017/05/03 21:44

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ntkkni31

2017/05/08 00:28

ありがとうございます。 やはりそもそもScalaではそういうやり方はしないようですね。 javaのクラスを使うか、構造を変えるか検討いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問