[解決済み] Scalaでsynchronizedを使うには?
2022-02-03 09:48:59
質問
次のようなコードがあります。
object Foo {
private var ctr = 0L
def bar = {
ctr = ctr + 1
// do something with ctr
}
}
要件は
ctr
の値は一度だけ使用する必要があります。私の場合、同じ値の
ctr
が再利用されています。私の理論では、この現象は
Foo.bar
が異なるスレッドで同時に呼び出されます(これしか結論が出ませんでした)。私は修正として以下の修正コードを用意しました。
object Foo {
private var ctr = 0L
def getCtr = synchronized{
ctr = ctr + 1
ctr
}
def bar = {
val currCtr = getCtr
// do something with currCtr
}
}
を使用するための良いガイドが見つかりませんでした。
synchronized
というメソッドをScalaで使うことができます。上記のコードが私の問題を解決するかどうか、どなたか教えていただけませんか?
EDIT: 下のコメントから、私は
AtomicLong
が私にとっての最適解です。
import java.util.concurrent.atomic.AtomicLong
private val ctr = new AtomicLong
def getCtr = ctr.incrementAndGet
解決方法は?
が必要ない場合は
AtomicInteger
を使用する方法です。
synchronized
object Foo {
private var ctr = 0L
def getCtr = this.synchronized {
ctr = ctr + 1
ctr
}
def bar = {
val currCtr = getCtr
// do something with currCtr
}
}
あるオブジェクトに対して同期をとる必要があります。この場合、あなたの現在のオブジェクトは
this
.
要するに、Scalaのフォーマットは(ブロックは値を返すことができる)。
this.synchronized {
ctr = ctr + 1
ctr
}
これは、javaの
synchronized(this) {
return ++ctr;
}
Scala には
synchronized
メソッドで、ブロックだけです。
編集
下のコメントからの質問にお答えします。
synchronized
をメソッドとして使用することができます。
AnyRef
:
https://www.scala-lang.org/api/current/scala/AnyRef.html
final def synchronized[T0](arg0: ⇒ T0): T0
というように、オブジェクトのメソッドを呼び出しているのです。
toString
と
this.toString
.
関連
-
[解決済み] Spark - CSVファイルをDataFrameとして読み込む?
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み】Scala 2.8のコレクション・ライブラリは「歴史上最も長い遺書」のケースか?[クローズド] Scala
-
[解決済み】タスクがシリアライズされない:オブジェクトではなくクラスに対してのみクロージャの外で関数を呼び出すとjava.io.NotSerializableExceptionが発生する
-
[解決済み】case objectとobjectの違いについて
-
[解決済み】Scalaのyieldとは何ですか?
-
[解決済み] 型の論理和(ユニオン型)はどのように定義するのですか?
-
[解決済み] 2つのマップをマージし、同じキーの値を合計するための最良の方法?
-
[解決済み] マクロから匿名クラスのメソッドを持つ構造型を取得する
-
[解決済み] Scalaは、コレクションをMap-by-keyに変換する最良の方法ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Sparkです。CoarseGrainedSchedulerが見つかりませんでした。
-
[解決済み] ScalaのSeqへのアペンド
-
[解決済み] NoClassDefFoundError: org/apache/hadoop/fs/StreamCapabilities (s3データをsparkで読み込む際に発生します。
-
[解決済み] TimeoutExceptionが発生した場合、どのような原因が考えられるでしょうか。Sparkで作業しているときに[n秒]後にFuturesがタイムアウトしました[重複]。
-
[解決済み] SparkSQL - パーケットファイルを直接読み込む
-
[解決済み】Scalaにおける中括弧と括弧の正式な違い、また、どのような場合に使用すべきなのか?
-
[解決済み】atomic / volatile / synchronizedの違いは何ですか?
-
[解決済み] Build.scala、%および%%の記号の意味
-
[解決済み] Scalaのパターンマッチングシステムで比較演算子を使う
-
[解決済み] Scalaの==と.equalsの違いは何ですか?