akasaka_34の日記

ネトウヨと呼ばれた男の日記。しかし頻度から言えば週報ぐらい。

今更だけど何故Thread#stop()はイケナイのか

Thread#stopがイケナイというのはずっと前から知ってる
でも昔は何故駄目なのかがよく分かってなかった。
要するに
「synchronizedなブロックがアトミックでなくなるから」
なのだけど
例えば

public synchronized void swap() {
Object obj = left;
left = right;
right = obj;
}

ってメソッドがあればsynchronizedのおかげで
安全にleftとrightの交換ができそうに見えるけど
left=rightとright=objの間でスレッドが死ねば
もともとleftに入っていた値は失われてしまう。
同じことが、まあ例えばSystem.out.println()の途中で発生すれば
System.outが壊れるかもよ。というわけでdeprecated。

こんなことも分からんなんて昔の僕はアホか?

と思ったんだけど、どうもOracle Technology Network for Java Developers | Oracle Technology Network | Oracleの日本語が良くないね。
「対象とするスレッドの処理準備ができていないという例外」
ってアンタ、なんかUnpreparedExceptionみたいなのがあるみたいじゃん。
原文は
「exceptions that its target thread is unprepared to handle」
だから
「対象とするスレッドの処理準備ができていない例外」
だよね。

こんな所でウダウダ書かずにメールでもすべきかとも思ったが
十年以上そのままになってる表現だからねえ
もしかしたら僕以外はみんなあの日本語で理解できてるのかもしれん。
どうなんだ?