Java threadLocal
ThreadLocalはスレッドローカル変数を提供し、各スレッドが独立したコピーを持てるようにすることで相互干渉を防ぎます。重要なポイントには、ThreadLocalMapのデータ構造、ハッシュアルゴリズム、衝突解決、期限切れキーのクリーンアップ機構、set/getメソッドの実装原理が含まれます。InheritableThreadLocalを使うと、親スレッドのローカル変数を子スレッドに引き継げるため、非同期シナリオでのデータ伝播問題を解決できます。実運用では、ログ記録や分散システムにおけるtraceId伝播などに活用できます。
Java AQS
AQS(AbstractQueuedSynchronizer、抽象キュー同期器)は、主にロックや同期器を構築するためのJavaの抽象クラスです。中核原理はCLHロックに基づく待機キューにより、スレッドのブロック待機と起床を実現する点にあります。AQSは排他モードと共有モードという2つのリソース共有方式をサポートします。代表的な同期ユーティリティにはSemaphoreとCountDownLatchがあり、それぞれリソースへの同時アクセス数の制御や複数スレッドの完了待ちに用いられます。CyclicBarrierは、最後のスレッドが到着するまで複数スレッドを同期点で待機させることができます。
Javaスレッドプールの使い方
OOMリスクを避けるためにThreadPoolExecutorでスレッドプールを明示的に作成し、スレッドプール状態を監視すること、また業務ごとに異なるスレッドプールを使うことが推奨されます。パラメータは適切に設定し、重複作成や長時間タスクを避け、障害調査しやすいようにスレッドプール名を明確にする必要があります。スレッドプールとThreadLocalの併用による問題にも注意し、コンテキスト伝播にはTransmittableThreadLocalの利用が推奨されます。
Java JMMメモリモデル
Javaメモリモデル(JMM)は、マルチスレッド環境における共有変数の可視性を定義し、CPUキャッシュモデルや命令の並べ替えに関わる概念を扱います。JMMはスレッドと主記憶の関係を規定することで、共有変数の可視性と一貫性を確保し、マルチスレッドプログラミングの問題を解決します。重要な概念にはhappens-before原則、原子性、可視性、順序性があり、並行環境での正しいプログラム実行を保証します。
Java並行プログラミング
本記事では、スレッドとプロセスの定義、Javaスレッドの実装機構、スレッドライフサイクル、並行と並列の違い、同期/非同期の概念、多重スレッドの長所と短所など、Java並行プログラミングの基礎を紹介します。さらに、スレッド安全性、デッドロックとその回避方法、volatileキーワードの使い方、楽観ロックと悲観ロックの違い、スレッドプールやFutureを使った実行効率の向上方法についても扱います。最後に、CyclicBarrierやCountDownLatchなどのツールの利用シーンと原理も紹介します。
Javaコレクション概要
Javaコレクションは主にCollectionインターフェースとMapインターフェースから派生し、List、Set、Queueなどのサブインターフェースを含みます。Listは順序付きで重複可能な要素、Setは一意要素、Queueは特定順序での要素管理、Mapはキーと値のペアを扱います。スレッド安全性やソートなどの要件に応じて適切なコレクションを選ぶ必要があります。Javaコレクションは配列より柔軟なデータ保存方法を提供し、多様な操作をサポートします。ArrayListとLinkedListの挿入・削除性能差、HashMapとHashtableのスレッド安全性と効率の違い、ConcurrentHashMapの高い並行性サポートについても触れています。
Javaリフレクション&プロキシ面接知識
リフレクションはフレームワークの中核機能であり、実行時にクラスを解析したりメソッドを呼び出したりできるため、Springなどで広く利用されています。利点は高い柔軟性ですが、安全性の問題や性能低下を招く可能性もあります。プロキシパターンはプロキシオブジェクトを通じて対象オブジェクトの機能を拡張するもので、静的プロキシと動的プロキシに分かれます。後者はより柔軟でフレームワークでよく使われます。JDK動的プロキシはインターフェース実装クラスのみを対象にでき、CGLIBは未実装クラスも代理可能です。動的プロキシは実行時にバイトコードを生成し、高い柔軟性と効率を提供します。
Java面接基礎
Java言語の特徴には、学びやすさ、オブジェクト指向、プラットフォーム非依存性、マルチスレッド対応、信頼性、安全性などがあります。Java SEは基礎版でデスクトップ用途向け、Java EEは企業版で複雑な業務アプリケーション向けです。JVM・JDK・JREの違いは、JVMがバイトコードを実行し、JDKが開発ツールキット、JREが実行環境である点です。Javaはバイトコードにより効率性を高め、コンパイルと解釈の併存をサポートします。例外処理はChecked/Uncheckedに分かれ、try-catch-finally構造を用います。ジェネリクスは可読性を高め、リフレクションは実行時解析能力を提供し、シリアライズはオブジェクト永続化に用いられます。I/Oストリームはバイト/文字ストリームに分かれ、デコレータやアダプタなどの設計パターンがI/Oで広く使われます。





