透2018/7/272018/10/22こんにちは!フリーランスの長野です。volatileって使ってますか?volatileは修飾子の一つで、マルチスレッド処理で使われます。・synchronizedとの違い・Threadについてなど応用的な内容についても解説していきます。まとめvolatileとは?volatileはJavaの修飾子の一つで、マルチスレッド処理で使われます。フィールドの値は通常メモリから呼び出され、更新されたりします。これはシングルスレッドの場合で、マルチスレッドの場合はこれとは違ってきます。スレッドが一列で順番に処理されていくことを、「シングルスレッド」と言います。これに対して、スレッドの列が2つ以上複数あり並列に同時進行で処理されていくことを「マルチスレッド」と言います。マルチスレッド処理の場合、それぞれのスレッドが同じフィールドの値を別々にキャッシュすることがあります。キャッシュとはメモリとは違う場所に値を保持することで、一般的にメモリに比べて保存容量は少ないですが、高速に値の呼び出しや更新ができます。マルチスレッドの場合、フィールドの値をメモリより高速に呼び出し・更新するためにキャッシュすることがあるのです。ここで注意しなければならないのが、それぞれのスレッドが同じフィールドの値を別々にキャッシュすると、同じフィールド名であっても値が違ってくる危険性があるということです。次のようなwhile文を記述し、コンパイルのあとに実行する場合を考えてみましょう。flagが0の間行われる処理}このwhile文のブロック内でflagの値を操作しない場合、while文の条件式を毎回評価する必要はありません。このような場合にwhile文はコンパイラによって以下のように最適化することが可能になります。}}シングルスレッドの場合はwhile文のブロック内でflagの値を操作しない場合、このように最適化されても問題ありません。マルチスレッドの場合は前述のとおり他のスレッドからflagの値を操作されることがあります。他のスレッドからflagの値を操作され変更された場合、最適化によってループから抜けられなくなる不具合が発生してしまうのです。そこで、このような処理を行う場合はvolatile修飾子を使用します。volatileの使い方volatile修飾子の使い方をサンプルコードで確認しましょう。更新このサンプルコードではフィールドcountの値が更新された場合に出力表示するスレッドクラスMultiThread1と約500ミリ秒ごとにcountの値を1ずつ増やすスレッドクラスMultiThread2を並列で処理しています。MultiThread1クラスのwhile文の条件式にはフィールドcountが使われていますが、while文のブロック内ではcountの値は操作されていません。この場合コンパイラで最適化される可能性がありますが、volatile修飾子を使って最適化を抑止しています。以下の実行結果はvolatile修飾子なしの場合の実行結果です。2このサンプルコードを実行すると、上記の実行結果を表示したあと無限にループし続けます。この場合volatile修飾子を使っていませんので、コンパイラで最適化され、意図した処理とは違う処理が実行されていると考えられます。synchronizedとの違いここまではコンパイラの最適化の抑止について説明しました。その他にもvolatile修飾子をフィールドにつけることで、マルチスレッド処理でメモリとキャッシュで値が違ってしまう危険性を避けるためにフィールドの値がキャッシュされるのを抑止することができます。同じようにメモリとキャッシュで値が違ってしまう危険性を避けるためにsynchronized修飾子が使われます。synchronized修飾子の付いたブロック内で扱うフィールドの値は、必ず元のメモリー上から呼び出し・更新されますので、キャッシュによる値の不整合を避けることができます。volatile修飾子は簡単な値の読み書き操作で、synchronized修飾子を付けて扱うまでもない場合に使います。synchronized修飾子ではスレッド・セーフが保証されていますが、volatile修飾子はスレッド・セーフは保証していませんので注意しましょう!volatile修飾子とsynchronized修飾子のその他の違いについてはこちらでも詳しく解説しています。https://www.javamex.com/tutorials/synchronization_volatile.shtmlThreadについてマルチスレッドおよびThreadクラスについてはこちらで詳しく解説していますので、ぜひ参考にしてください。2019年4月29日まとめここでは、volatile修飾子について説明しました。マルチスレッド処理でフィールドの値が他のスレッドで変更される場合、コンパイルの最適化によって無限ループにならないか注意する必要があります。マルチスレッドの記述は最初は複雑だと感じるかもしれませんが、慣れて使いこなすことができるようにこの記事を何度も参考にして下さいね!TweetPocket無料でSEからWebエンジニアへ転職しませんか?侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、システムエンジニアという職業だけどコードが書けない事務作業が多くスキルがないため将来が不安スクールに通うと完全未経験者と同じスタートになるからレベルが合わないという、すでに知識があるSEならではのお悩みがあることに気づきました。弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。こちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。お問合せはこちらでも受け付けています。