ラベル アウト・オブ・オーダー実行 の投稿を表示しています。 すべての投稿を表示
ラベル アウト・オブ・オーダー実行 の投稿を表示しています。 すべての投稿を表示

2020/04/08

Java の final の仕様(3) - final フィールドのセマンティクスの有用性と仕組み

final フィールドのセマンティクス

final フィールドは初期化されたら変更されることはありません。そのため、final フィールドへのアクセスと、通常のフィールドへのアクセスは、その意味するところ (セマンティクス) が少し異なってきます。例えば、通常のフィールドの内容の参照は、「そのタイミングでの値」を取得するという意味を持ちますが、final フィールドの場合は内容が変わりませんから、「そのタイミングでの」という意味は抜け落ちます。
Java は final フィールドのセマンティクスを活用して、メモリアクセスの最適化をしたり、同期化を減らしたり、セキュリティを担保したりしています。Java 言語仕様に沿って確認してみたいと思います。

2020/03/21

Java のシングルトンを正しく実装しよう

Java プログラマの皆さん、シングルトンを正しく実装できますか? 「そんなの簡単だよ」とおっしゃると思いますが、意外と注意点が多いものです。ここでは正しいシングルトンの実装を確認しておきたいと思います。

Double-checked locking は使わないようにしましょう

Double-checked locking (DCL) とは?

Double-checked locking とは、マルチスレッドプログラムにおいて、複数スレッドから参照される変数について、初めて参照されたときに一度だけ初期化を行いたい場合に、同期化のコストを最小化するために考えられた idiom です。
変数への代入が行われるのは初期化時だけなので、同期化が必要なのはそのときだけです。したがって、初期化が終わっているときは同期化をしないようにすることで、同期化のコストを回避しようという発想です。

アウト・オブ・オーダー実行に気を付けよう

現代のアーキテクチャのコンピュータでマルチスレッド・プログラミングをする場合には、アウト・オブ・オーダー実行のことを理解しておく必要があります。
プログラマの皆さんは、「プログラムは思った通りに動くのではない。書いた通りに動くのだ。」と教わってきたと思いますが、イマドキのコンピュータでは、書いた通りには動いていません。
アウト・オブ・オーダー実行について、しっかり理解しておきましょう。