Scalaの扱いは、Javaとは異なるスレッドでローカル変数を「共有しますか」?それがどのように動作しますか?

allidoiswin:

どのようにローカル変数の仕事の私の精神的なモデルは、彼らがスタックに保存されており、各スレッドは独自のスタックを持っており、スタックはスレッド間でアクセスすることはできません。

Javaでは、私は実際には、コンパイラが、私はラムダまたは内部クラスでそれを変更することはできません文句を言うので、私は、生成されたスレッド内のローカル変数を変更する方法をわかりません。

しかし、Scalaで私はこれを行うことができます。

implicit val ec = scala.concurrent.ExecutionContext.global

var i = 5

val f = Future {
  println((1, i))
  i = 6
  println((1, i))
}
val g = Future {
  println((2, i))
  println((2, i))
  println((2, i))
}
Await.result(f, 3.seconds)

との結果を得ます

(2,5)
(1,5)
(2,5)
(2,6)
(1,6)

どのようにスレッド#2は、スレッド#1からの変更を参照してくださいでしょうか?

St.Antario:

あなたは正確に正しいです。各スレッドは独自のスタックを持っており、ローカル変数はスタック上に存在します。

これは、ローカル変数が最終または効果的に最終的である必要があり、Javaの理由です。配列へのポインタが効果的に最終的なスタック上に置かれますが、配列の要素が閉鎖内から変更することができるので、しかし、あなたは、よく知られている単一素子アレイトリックを採用することができます。このような:

int a[] = new a[0];
Thread t = new Thread(() -> {
    a[0] = 1;
});
//...

Scalaのコンパイラでは、あなたのために同様のことを行い、それ自体で、ヒープの代わりに、スタック上に置きます。(申し訳ありませんが、そのバイトコードrightawayで簡単なScalaの例と外観を書き込み、それはかなり簡単でと読めることはできませんjavap -c

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=213283&siteId=1