家族について考えるパパのブログ

普段の生活をいかに快適に過ごすかを考えて実践をしていくブログ

Java スレッドについて

こんにちは。

 

スレッドという単語にぶつかって全然意味がわからなかったので、それについてまとめます。

 

スレッドとは

プログラムの実行状態をスレッドという。

通常のJavaプログラムは最初に1つのスレッドを持つ。

 

このスレッドは実行中、mainメソッドから始まるスタックトレースを持ちます。

プログラムの中で新しいスレッドを作成すると複数の実行状態(スレッド)を持てます。

このようなプログラムは、「マルチスレッド化したプログラム」という。

 

スレッドの動作

スレッドは概念上、同時かつ並行で動く。実際、CPU(コア)が複数あれば物理的にも並行動作する。

しかし、CPUコア数以上の場合、スレッドはタイムスライスという動作をする。

 

タイムスライスとは

あるスレッドを一定時間実行した後、別のスレッドに実行を譲る動作のことをいう。

これは、非常に短い時間間隔でスレッド実行を切り替えるため並行動作するように見えます。

スレッドの切り替わりは強制的に起きる。

また、停止中にメソッド呼び出しのスタックトレースは変化しないので、スレッド実行開始後は同じコードの停止箇所から実行を再開する。

 

複数スレッドが同じメソッドを実行する時に気をつけなければならないこと

共有データの扱いは気をつけなければならない。

ある変数の値を複数のスレッドが同時に更新すると不整合が生じうる。

この共有データの不整合を防ぐ仕組みを同期処理や排他制御と呼ぶ。

マルチスレッドで本質的に難しいのは、同期処理になります。

 

スレッドの横取りが起きないと保証されている操作を「アトミックな操作」という。

スレッドの横取りで発生しうる不整合を防ぐために、Javaはロックという仕組みを提供している。

 

マルチスレッドプログラムの鉄則

マルチスレッドでデータの不整合を起こさないためには次のいずれかの処理をする必要がある。

・スレッド間でオブジェクトを共有しない(Webアプリの場合のリクエストスコープなど)

・不変オブジェクトにする

・適切な同期処理を行う

 

わからなかった単語

スタックトレース

 → これまでlogくらいの認識しかありませんでした、正確には何を表しているのかを確認する必要あり。

 

読んでいただきありがとうございます。

 

参考にしたもの

パーフェクトJava