goo blog サービス終了のお知らせ 

コンピュータ・プログラミング日誌

記録をつけていきます。

Javaスレッドでのロック(lock)

2020-12-11 23:57:11 | Java
Java Gold SE8 (山本道子著)のP376にこう書いてある。

 共有して使用されるオブジェクトの中で、複数のスレッドで同時に実行したくない箇所にsynchronizedキーワードを指定すると、吐いた制御を実現できます。synchronizedを使用することにより、同時に1つのスレッドからしか実行されないことが保証されます。
 synchronizedが指定された箇所をあるスレッドが実行している間、共有のオブジェクトはロックがかかった状態になります。ロック(lock)は直訳の「施錠」のとおり、オブジェクトに鍵をかけます。したがって、ロックがかかっている状態のときに別のスレッドに制御が移り、そのスレッドが共有オブジェクトのsynchronizedが指定された箇所を実行しようとしても、そのスレッドは待たされることになります。そして、synchronizedが指定された箇所の処理が終了するとロックは解放されます。

Javaのスレッドでのnotify

2020-12-11 23:43:11 | Java
Javaスレッドでのwait()をした後にnotify()を行うケースがある。

wait()(待機)は待機を指定するコーディングで、他スレッドがnotify()(通知)をした時に、実行可能状態として励起する。

つまりwait()を指定されたスレッドは、自分が実行命令を下されていて一旦待機を命じられたものの、次なる命令(通知)が来て自分が動き出すタイミングは今か今かと待っているのだ。


Javaのスレッドはどういう風に考えればいいか interrupt/yield/join

2020-12-11 23:15:53 | Java
Javaのスレッドはどういう風に考えればいいか。
特にinterrupt/yield/joinの類である。

インターネット上には適切に理解するページが無く、よって私が作った。
私の理解や認識を書き起こしたもので、厳密には違うかもしれないが、個人的にはこれで合っていると思っている。

最初に文章をだらだらと書いたが、直感的に知りたい人は、このページの下部にどういう処理を行ったのかという図を書いたので、そちらを参照頂きたい。
また、QAで同時質問しているが、CPUが複数ある場合は同時進行もできるようである。
ただその場合は話が煩雑になるので、CPUが1つのパターンを想定して図を書いた。


1.用語定義

Javaの日本語訳は、とにかく表面上の語句・語彙しか使っていなく、その動作の本質を伝えていない。
よって私が(私用に)分かりやすく再翻訳した。

interrupt・・・参考書などでは「割り込み」と書かれていて、一般的にもそのような表現になっているが、完全に誤訳だ。本来であるならば「強制中断」が正しいと思われる。

interruptの訳語は、「継続している何かを途中で外側から強制的に中断させたり邪魔をする」と言うのが第一義で、日本語のニュアンスで言う「継続している主体を一時静止させて、別の個体を主体がいた手前に参加させる」と言う意味での「割り込み」は第二義だ。そしてそうした処理はスレッドのinterruptで発生していない。
後の図で詳しく述べるが、結果的には後続処理が詰めて処理されるので「割り込み」が発生しているという見方もできなくはないのだが、基本的にはJavaスレッドでのinterruptを発動させる思想背景は、そのスレッド処理をその時点で「中断(interrupt)」させたいからそうするのである。他の処理を優先して「割り込ませ(interrupt)」たいからそうしているのではないと、このinterruptが使用されている前後関係からそう私は推測する。

尚、Java Gold SE8(山本道子著)では、その373ページに「休止中のスレッドに割り込みを入れる。」と記載する。


yield・・・Java Gold SE8(山本道子著)では、「現在実行しているスレッドを一時的に休止し、他のスレッドに実行機会を与える」と書かれる(P371)。つまりは休止の概念なのだが、これは実行権限の優先順位を他のスレッドに移譲した上で自分が待機状態に入る、と言うのが正しいように思われる。

yieldの日本語訳としては、産出する、産む、もたらす、ひきおこす、などがあるが、第二義的なの語義として「明け渡す」「譲渡する」があるのでこちらが概念としては近い。


join・・・Java Gold SE8(山本道子著)では、「実行中のスレッドが終了するまで待機する」と書かれる(P371)。
joinの日本語訳としては「結合する、(…を)接合する、つなぐ、取り付ける、結合させる、加わる、加入する、(…の)仲間になる、帰任する、一緒になる」となるのだが、これの意訳文には「合流する」があり、これが一番近い。合流するまで待機する(合流地点をここに設定する)と言うのが正しいように思われる。


2.実際の処理の動き

実際CPU一個の場合の時分割処理において、マルチスレッドが行儀よく遂行された場合の模式図を書いてみた。

私のメモなので、改めて見ると処理の順番が他の人にはかなり分かりにくいが、そこは省略した。

















やっと分かった・・・オブジェクトを渡す仕組み

2020-09-06 21:55:54 | Java
本当に長い年月がかかったが、やっとオブジェクトが何なのかが分かった。

オブジェクトとは「スイッチ付きマシーン」のことだったんだ、と。

コーディングが設計の図面で、インスタンス化される時に、そのコーディングを元にマシーンが実体化される。
しかもそのスイッチには単に何かの動作をするだけのものや、あるいは値を投入して属性をもたせる調整弁などのスイッチが多種多様にできる。



と言うか本当このJavaの本は分かりづらい

2019-11-17 00:57:17 | Java
昭和情報プロセス株式会社発行の JavaプログラマGoldSE8(山本道子著)を読んでいる。

この212ページから213ページを読んでいるが、本当分かりづらい。

自分の知識を単に記述するのではなく、まだ知識として理解するに至ってない読者が、どのように理解するのかという歩きやすい道程を考えて記載しているとは考えられない。

なので、前記事において私なりにまとめなおした。