国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&チュートリアル 大手企業(yè)のJava面接質(zhì)問まとめ(全て)

大手企業(yè)のJava面接質(zhì)問まとめ(全て)

Aug 10, 2018 pm 03:43 PM
ジャワのインタビュー 面接の質(zhì)問

ThreadLocal (スレッド変數(shù)のコピー)

Synchronized はメモリ共有を?qū)g裝し、ThreadLocal は各スレッドのローカル変數(shù)を維持します。
時間にスペースを使用することで、スレッド間のデータ分離に使用され、変數(shù)を使用する各スレッドにコピーが提供され、各スレッドは他のスレッドのコピーと競合することなく、獨(dú)自のコピーを獨(dú)立して変更できます。
ThreadLocal クラスは、各スレッドの変數(shù)のコピーを保存する Map を維持します。Map 內(nèi)の要素のキーはスレッド オブジェクトであり、値は対応するスレッドの変數(shù)のコピーです。
ThreadLocal は Spring で大きな役割を果たしており、リクエスト スコープ內(nèi)の Bean 管理、トランザクション管理、タスク スケジューリング、AOP などのモジュールに登場します。 Spring のほとんどの Bean はシングルトン スコープとして宣言でき、ThreadLocal を使用してカプセル化できるため、ステートフル Bean はマルチスレッドでシングルトン方式で正常に動作できます。

Java 仮想マシンの仕様では、Java ランタイム データを 6 つのタイプに分類しています。

1. プログラムカウンター: 現(xiàn)在実行中のプログラムのメモリアドレスを保存するために使用されるデータ構(gòu)造です。 Java 仮想マシンのマルチスレッドは、スレッドを順番に切り替えてプロセッサ時間を割り當(dāng)てることで実現(xiàn)されます。スレッド切り替え後に正しい位置に戻るために、各スレッドは相互に影響を及ぼさない獨(dú)立したプログラム カウンタを必要とします。スレッドは非公開です。」
2.Java 仮想マシン スタック: スレッド ライフ サイクルと同じプライベート スレッド。ローカル変數(shù)テーブル、操作スタック、メソッドの戻り値を保存するために使用されます。ローカル変數(shù)テーブルには、基本的なデータ型とオブジェクト參照が保持されます。
3. ネイティブ メソッド スタック: 仮想マシン スタックとよく似ていますが、仮想マシンで使用されるネイティブ メソッドを提供します。
4.Java ヒープ: すべてのスレッドによって共有されるメモリ領(lǐng)域。ほぼすべてのオブジェクト インスタンスがメモリを割り當(dāng)てます。
5. メソッド領(lǐng)域: 各スレッドによって共有される領(lǐng)域で、仮想マシンによってロードされたクラス情報、定數(shù)、靜的変數(shù)、およびコンパイルされたコードが格納されます。
6. 実行時定數(shù)プール: 実行時の各クラス ファイル內(nèi)の定數(shù)テーブルを表します。コンパイル時の數(shù)値定數(shù)、メソッドまたはフィールド參照など、いくつかのタイプの定數(shù)が含まれます。

「Java GC がいつ、どのように行われたかについて話してもらえますか?」

いつ:
1. 新しい世代には、Eden エリアと 2 つの Survivor エリアが存在します。不足している場合は、Eden エリアに入ります。それでも収まらない場合は、生き殘ったオブジェクトを別の生存領(lǐng)域に移動し、Eden と以前のオブジェクトをクリアします。生存者エリアの。特定の GC プロセス中に、削除できないオブジェクトが見つかった場合、これらのオブジェクトは古い世代のメモリに置かれます。
2. 大きな物體や長期保存物が直接高齢者エリアに入ります。
3. マイナー GC が実行されるたびに、古い領(lǐng)域に移動しようとしている古いオブジェクトのサイズが古い領(lǐng)域の殘りのサイズを超える場合は、それらのオブジェクトを分析する必要があります??赡埭氏蓼旮啐h者エリアのスペースを確保するためにフル GC が実行されます。
內(nèi)容: GC ルートからオブジェクトを検索できず、マークのクリーンアップ後も復(fù)活したオブジェクトがありません。
やるべきこと: 若い世代: コピーのクリーニング; 古い世代: マークスイープおよびマーク圧縮アルゴリズム; 永続的な世代: Java とクラスをロードするクラスローダー自體にクラスを保存します。
GC ルートとは: 1. 仮想マシン スタックで參照されるオブジェクト 2. メソッド領(lǐng)域の靜的プロパティによって參照されるオブジェクト、定數(shù)によって參照されるオブジェクト 3. ローカル メソッド スタック內(nèi)の JNI (一般的にネイティブ メソッド) によって參照されるオブジェクト。

Synchronized と Lock はどちらも再入可能なロックで、同じスレッドが同期コードに再度入ると、取得したロックを使用できます。

同期は悲観的ロック機(jī)構(gòu)と排他的ロックです。 Locks.ReentrantLock は毎回ロックするわけではありませんが、競合がないと想定して操作を完了します。競合により失敗した場合は、成功するまで再試行します。 ReentrantLock に適用されるシナリオ

  1. ロックの制御を待機(jī)中にスレッドを中斷する必要がある

  2. ReentrantLock の條件アプリケーションは、どのスレッドに通知するか、およびロックを制御できます。複數(shù)の條件を設(shè)定できます。

  3. フェアロック機(jī)能を使用すると、すべての受信スレッドがキューに入れられて待機(jī)します。

  4. StringBuffer はスレッドセーフです。文字列が操作されるたびに、StringBuffer はスレッドセーフではありません。

fail-fast: このメカニズムは Java の 1 つです。コレクション (Collection) エラー メカニズム。複數(shù)のスレッドが同じコレクションのコンテンツを操作すると、フェイルファスト イベントが発生する可能性があります。

例: スレッド A がイテレーターを介してコレクションを走査するときに、コレクションの內(nèi)容が他のスレッドによって変更された場合、スレッド A がコレクションにアクセスすると、ConcurrentModificationException 例外がスローされ、フェイルファスト イベントが発生します。

前に発生: 2 つの操作間に前に発生の関係がある場合、前の操作の結(jié)果が後の操作に表示されます。
1. プログラムシーケンスのルール: スレッド內(nèi)の各操作は、スレッド內(nèi)の後続の操作よりも前に発生します。
2. モニター ロックのルール: モニター ロックのロック解除は、その後のモニター ロックのロックより前に行われます。
3. 揮発性変數(shù)のルール: 揮発性フィールドへの書き込みは、その後のこの揮発性フィールドの読み取りより前に行われます。
4. 推移性: A が B より前に発生し、B が C より前に発生した場合、A は C より前に発生します。
5. スレッド起動ルール: Thread オブジェクトの start() メソッドは、このスレッドのすべてのアクションの前に発生します。

Volatile と Synchronized には 4 つの違いがあります:
1 粒度が異なり、前者は変數(shù)をターゲットにし、後者はオブジェクトとクラスをロックします
2 syn はブロックしますが、volatile スレッドはブロックしません
3 syn は 3 つの主要な機(jī)能を保証しますが、volatile は保証しませんatomicity
4 syn コンパイラの最適化、volatile には最適化されていません:

1. すべてのスレッドに対してこの変數(shù)の可視性を保証します。つまり、スレッドがこの変數(shù)の値を変更すると、新しい値が可視になります。他のスレッドにアクセスできますが、マルチスレッドセーフではありません。
2. 命令の並べ替えの最適化を無効にします。

Volatile がメモリの可視性を確保する方法:

1. volatile 変數(shù)を書き込むとき、JMM はスレッドに対応するローカル メモリ內(nèi)の共有変數(shù)をメイン メモリに更新します。
2. 揮発性変數(shù)を読み取るとき、JMM はスレッドに対応するローカル メモリを無効にします。次にスレッドはメイン メモリから共有変數(shù)を読み取ります。

同期: 1 つのタスクの完了は別のタスクに依存します。依存タスクは、依存タスクが完了するのを待った後にのみ完了できます。
非同期: 依存タスクが完了するのを待つ必要はありません。依存タスクに完了する作業(yè)を通知するだけで済みます。獨(dú)自のタスクが完了する限り、タスクは完了し、依存タスクに通知が返されます。完成しているかどうか。 (非同期の特徴は通知です)。 通話とテキストメッセージは、同期操作と非同期操作の比喩です。
ブロッキング: CPU は停止し、遅い操作が完了するまで待機(jī)してから、他の作業(yè)を完了します。
ノンブロッキング: ノンブロッキングとは、低速実行中に CPU が他の作業(yè)を?qū)g行し、低速実行が完了した後、後続の操作を完了することを意味します。
ノンブロッキングによりスレッドの切り替えが増加します。CPU 使用時間の増加がシステムの切り替えコストを補(bǔ)えるかどうかを考慮する必要があります。

CAS (比較および交換) ロックフリー アルゴリズム: CAS は、複數(shù)のスレッドが CAS を使用して同じ変數(shù)を同時に更新しようとすると、そのうちの 1 つのスレッドのみが変數(shù)の値を更新できます。 、他のスレッドは失敗します。スレッドは一時停止されませんが、競合が失敗したことが通知され、再試行できます。 CAS には、メモリ値 V、古い期待値 A、および変更される新しい値 B の 3 つのオペランドがあります。期待値 A とメモリ値 V が同じである場合に限り、メモリ値 V を B に変更します。そうでない場合は何も行いません。

スレッドプールの役割: プログラムが開始されると、処理に応答するために複數(shù)のスレッドが作成され、その內(nèi)部のスレッドは作業(yè)スレッドと呼ばれます。
第一: リソースの消費(fèi)を削減します。作成されたスレッドを再利用することで、スレッドの作成と破棄のコストを削減します。
2 番目: 応答速度を向上させます。タスクが到著すると、スレッドの作成を待たずにすぐにタスクを?qū)g行できます。
3 番目: スレッドの管理性を向上させます。
一般的に使用されるスレッド プール: ExecutorService は主要な実裝クラスであり、その中で一般的に使用されるものは Executors.newSingleThreadPool()、newFixedThreadPool()、newcachedTheadPool()、newScheduledThreadPool() です。

クラスローダーの動作メカニズム:
1. ロード: Java バイナリコードを jvm にインポートし、クラスファイルを生成します。
2. 接続: a) 検証: ロードされたクラスファイルデータの正確性を確認(rèn)します b) 準(zhǔn)備: クラスの靜的変數(shù)に記憶領(lǐng)域を割り當(dāng)てます c) 解析: シンボル?yún)⒄栅蛑苯訁⒄栅藟鋼Qします
3: 初期化: クラス Static変數(shù)、靜的メソッド、および靜的コード ブロックは初期化作業(yè)を?qū)g行します。
親委任モデル: クラスローダーがクラスロードリクエストを受信すると、まずそのリクエストを親クラスローダーに委任して、ユーザー定義ローダー→アプリケーションローダー→拡張クラスローダー→クラスローダーの開始を完了します。

一貫したハッシュ:
Memcahed キャッシュ:
データ構(gòu)造: キー、値のペア
使用メソッド: get、put およびその他のメソッド

Redis データ構(gòu)造: String—文字列 (キーと値の型)
ハッシュ—辭書 (ハッシュマップ) ) Redis のハッシュ構(gòu)造により、データベースの屬性を更新するのと同じように、1 つの屬性値のみを変更できます
List — リストはメッセージ キューを?qū)g裝します
Set — セットは一意性を利用します
Sorted Set — 順序付きセットを並べ替えることができますデータの永続性を?qū)g現(xiàn)できます

Javaの自動ボックス化とアンボックス化の詳細(xì)な分析
Javaのリフレクションメカニズムについて話す
不変クラスの書き方は?

インデックス: B+、B-、フルテキスト インデックス
Mysql のインデックスは、データベースが効率的にデータを検索できるように設(shè)計されたデータ構(gòu)造です。
一般的に使用されるデータ構(gòu)造は B+Tree です。各リーフ ノードはインデックス キーの関連情報を格納するだけでなく、隣接するリーフ ノードへのポインタを追加します。これにより、シーケンシャル アクセス ポインタを持つ B+Tree が形成されます。さまざまな間隔でのアクセスのパフォーマンスを向上させます。
インデックスを使用する場合:

  1. group by、order by、および個別のキーワードの後に??よく現(xiàn)れるフィールド

  2. 他のテーブルに頻繁に接続されるテーブルは、接続されたフィールドにインデックスを作成する必要があります

  3. 頻繁に使用されるフィールドWhere 句に出現(xiàn)します

  4. 多くの場合、クエリ選択に使用されるフィールドとして出現(xiàn)します

Spring IOC (制御の反転、依存性注入)
Spring は、屬性 (Setter メソッド) インジェクション、コンストラクター インジェクション、およびインターフェースインジェクション。
Spring では、アプリケーションを構(gòu)成し、Spring IOC コンテナーによって管理されるオブジェクトは Bean と呼ばれます。
Spring の IOC コンテナは Bean をインスタンス化し、リフレクション メカニズムを通じて Bean 間の依存関係を確立します。
簡単に言うと、Bean は Spring IOC コンテナによって初期化、組み立て、管理されるオブジェクトです。
Bean オブジェクトを取得するプロセスは、まず Resource を通じて設(shè)定ファイルをロードし、IOC コンテナを起動し、次に getBean メソッドを通じて Bean オブジェクトを取得し、そのメソッドを呼び出します。
Spring Bean スコープ:
Singleton: Spring IOC コンテナーには共有 Bean インスタンスが 1 つだけあり、通常は Singleton スコープです。
プロトタイプ: 各リクエストは新しい Bean インスタンスを生成します。
リクエスト: 各 http リクエストは新しい Bean インスタンスを生成します。

エージェントの共通の利點(diǎn): ビジネス クラスはビジネス ロジック自體にのみ焦點(diǎn)を當(dāng)てる必要があり、ビジネス クラスの再利用性が保証されます。
Java 靜的プロキシ:
プロキシ オブジェクトとターゲット オブジェクトは同じインターフェイスを?qū)g裝します。ターゲット オブジェクトは、特定のインターフェイス実裝では、対応するインターフェイスの呼び出しの前後に他のビジネス処理ロジックを追加できます。対象オブジェクトのメソッド。
欠點(diǎn): 1 つのプロキシ クラスは 1 つのビジネス クラスしかプロキシできません。ビジネス クラスがメソッドを追加する場合、対応するプロキシ クラスもメソッドを追加する必要があります。
Java 動的プロキシ:
Java 動的プロキシは、InvocationHandler インターフェイスを?qū)g裝し、Invoke メソッドをオーバーライドするクラスを作成します。このパブリック プロキシ クラスは、プロキシするオブジェクトのみを明確にすることができます。実行中に同時にプロキシされたクラスのメソッドを?qū)g裝でき、クラス メソッドの実裝時に拡張を?qū)g行できます。
実際: プロキシ オブジェクトのメソッド = 拡張処理 + プロキシ オブジェクトのメソッド

動的プロキシ クラスを生成する JDK と CGLIB の違い:
JDK 動的プロキシは、インターフェイスを?qū)g裝するクラスのプロキシを生成 (クラスのインスタンス化) することしかできません。このとき、プロキシ オブジェクトとターゲット オブジェクトは同じインターフェイスを?qū)g裝し、ターゲット オブジェクトはプロキシ オブジェクトの屬性として使用され、対応するメソッドの呼び出しの前後に他の業(yè)務(wù)処理ロジックを追加できます。 CGLIB は、クラスのプロキシを?qū)g裝します。主に、指定されたクラスのサブクラスを (クラスをインスタンス化せずに) 生成し、その中のメソッドをオーバーライドします。
Spring AOP アプリケーション シナリオ
パフォーマンス テスト、アクセス制御、ログ管理、トランザクションなど
デフォルトの戦略は、ターゲット クラスがインターフェイスを?qū)g裝する場合、JDK 動的プロキシ テクノロジを使用することです。ターゲット オブジェクトがインターフェイスを?qū)g裝しない場合、CGLIB プロキシがデフォルトで使用されます

SpringMVC 動作原理

  1. クライアント リクエストが送信されます。 to DispatcherServlet

  2. DispatcherServlet コントローラーは HandlerMapping をクエリし、それを見つけて、指定されたコントローラーに配布します。

  3. Controllerは、ビジネスロジック処理を呼び出した後、ModelAndViewに戻ります

  4. DispatcherServletは、1つ以上のViewResolerビューパーサーをクエリして、ModelAndViewで指定されたビューを見つけます

  5. ビューは、結(jié)果をクライアントに表示する責(zé)任があります

HTTP リクエスト

DNS ドメイン名解決 –> TCP スリーウェイ ハンドシェイクを開始 –> サーバーは http リクエストに応答し、ブラウザは HTML コードを取得します。 HTML コードを解析し、HTML コード リソース (JavaScript、CSS、畫像など) を要求します –> ブラウザはページをレンダリングしてユーザーに表示します

大量のデータを保存するストレージ システムを設(shè)計します。 「中間層」と呼ばれる層では、データベースから大量のデータを取得し、キャッシュし、サーバーのメモリ上で実行します。同様に、新しいデータが到著すると、それも最初にキャッシュされます。そして、それをデータベースに永続化する方法を見つけます。これは単純なアイデアです。主なステップは負(fù)荷分散です。これは、さまざまなユーザーからのリクエストをさまざまな処理ノードに分散し、それらをキャッシュに保存し、データをメイン データベースに定期的に更新します。読み取りおよび書き込みプロセスでは、常に (データの書き込み時も) 読み取ることができるオプティミスティック ロックと同様のメカニズムが使用されますが、今回読み取られたバージョンが以前のバージョンよりも低い場合は、読み取られるたびにバージョン マークが表示されます。キャッシュされたバージョンでは、データが再度読み取られます。この狀況はまれであり、許容できます。

セッションと Cookie: Cookie を使用すると、サーバーは各クライアントの訪問を追跡できますが、これらの Cookie はクライアントの訪問ごとに返される必要があります。Cookie が多い場合、クライアントとサーバー間のデータ送信量が目に見えないほど増加します。 Session はこの問題を非常にうまく解決します。同じクライアントがサーバーと対話するたびに、毎回すべての Cookie 値を返す必要はなく、毎回 ID を返します。クライアントはサーバーによって生成された一意の ID にアクセスします。クライアントはこの ID を返すだけで済みます。通常、この ID は JSESSIONID という名前の Cookie です。このようにして、サーバーはこの ID を使用して、サーバーに保存されている KV 値を取得できます。
セッションとCookieのタイムアウトの問題、Cookieのセキュリティの問題

分散セッションフレームワーク

  1. 構(gòu)成サーバー、Zookeeperクラスター管理サーバーは、すべてのサーバーの構(gòu)成ファイルを均一に管理できます

  2. これらのセッションの共有は分散キャッシュに保存され、 Memcache や Tair など、いつでも書き込みと読み取りが可能で、パフォーマンスが非常に優(yōu)れている必要があります。

  3. HttpSessionを継承するクラスをカプセル化し、セッションをこのクラスに格納してから分散キャッシュに格納します

  4. ドメインを越えてCookieにアクセスできないため、セッションの同期を?qū)g現(xiàn)するには、セッションIDを同期して書き込む必要があります別のドメイン名にダウンします。

アダプター モード: Java I/O の InputStreamReader は、Reader クラスを InputStream に適応させ、それによってバイト ストリームから文字ストリームへの正確な変換を?qū)g現(xiàn)します。

デコレーターモード: オリジナルのインターフェースを維持し、オリジナルの機(jī)能を強(qiáng)化します。
FileInputStream は、InputStream のすべてのインターフェイスを?qū)g裝します。BufferedInputStreams は FileInputStream を継承し、読み取りパフォーマンスを向上させるために、InputStream によって読み取られたコンテンツをメモリに保存する特定のデコレータ実裝者です。

Spring トランザクション設(shè)定メソッド:

1. トランザクションの側(cè)面を?qū)g裝するビジネス クラス メソッドを見つけるために使用されるポイントカット情報
2. トランザクションの動作を制御するトランザクション屬性。これらの屬性には、トランザクション分離レベル、トランザクション伝播動作、タイムアウト期間、ロールバック ルールが含まれます。

Spring は、宣言型トランザクション設(shè)定に aop/tx スキーマ名前空間と @Transaction アノテーション テクノロジーを使用します。

Mybatis

すべての Mybatis アプリケーションは、SqlSessionFactory オブジェクトのインスタンスを中心としています。まず、バイト ストリームを使用して Resource を通じて構(gòu)成ファイルを読み取り、次に SqlSessionFactoryBuilder().build メソッドを通じて SqlSessionFactory を作成し、次に SqlSessionFactory.openSession() メソッドを通じて各データベース トランザクションを提供する SqlSession を作成します。
Mybatis の初期化 –> SqlSession の作成 –> SQL ステートメントを?qū)g行して結(jié)果を返す 3 つのプロセスを?qū)g行します

サーブレットとフィルターの違い:

プロセス全體は次のとおりです: フィルターはユーザー リクエストを前処理し、リクエストをサーブレットに渡します応答を処理して生成し、最後にフィルターによってサーバー応答を後処理します。

Filter には次の用途があります:

Filter は、特定の URL リクエストと応答を前処理および後処理できます。
HttpServletRequest がサーブレットに到達(dá)する前に、クライアントの HttpServletRequest をインターセプトします。
必要に応じて HttpServletRequest を確認(rèn)し、HttpServletRequest ヘッダーとデータを変更することもできます。
HttpServletResponse がクライアントに到達(dá)する前にインターセプトします。
必要に応じて HttpServletResponse を確認(rèn)し、HttpServletResponse ヘッダーとデータを変更することもできます。

実際、フィルターとサーブレットは非常に似ていますが、唯一の違いはフィルターがユーザーへの応答を直接生成できないことです。実際、Filter の doFilter() メソッドのコードは、複數(shù)のサーブレットの service() メソッドから抽出された共通のコードです。Filter を使用すると、再利用を改善できます。

フィルターとサーブレットのライフサイクル:

1. Web サーバーの起動時にフィルターが初期化されます
2. サーブレットが 1 で設(shè)定されている場合、Tomcat (サーブレット コンテナー) の起動時にサーブレットも初期化されます。
3. サーブレットが設(shè)定されていない場合 1、Tomcat の起動時にサーブレットは初期化されませんが、リクエストが來たときに初期化されます。
4. リクエストが行われるたびにリクエストは初期化され、リクエストに応答した後、リクエストは破棄されます。
5.サーブレットが初期化された後、リクエストが終了してもログアウトされません。
6. Tomcat を閉じると、サーブレットとフィルターが順番にログアウトされます。

HashMapとHashTableの違い。

1. HashMap はスレッドセーフではありませんが、HashTable はスレッドセーフです。
2. HashMap のキーと値はどちらも null 値を許可しますが、HashTable は許可しません。
3. スレッドの安全性の問題により、HashMap は HashTable よりも効率的です。

HashMap 実裝メカニズム:

  1. は、各要素がリンク リストであり、リンク リストの各ノードが Entry[] キーと値のペアのデータ構(gòu)造である配列を維持します。

  2. は、配列 + リンク リスト、高速検索、高速挿入と削除の特性を?qū)g裝します。

  3. 各キーについて、対応する配列インデックスの添字は int i = hash(key.hashcode)&(len-1);

  4. 新しく追加された各ノードはリンクされたリストの先頭に配置され、その後新しく追加されたノードは元のリンクされたリストの先頭を指します

HashMapとTreeMapの違い


HashMapの競合


HashMap、ConcurrentHashMap、LinkedHashMapの違い

  1. ConcurrentHashMap は、ロック セグメンテーション テクノロジを使用して、スレッドの安全性を確保します。ロック セグメンテーション テクノロジ: まず、データをストレージ用のセグメントに分割し、次に、スレッドがロックのいずれかにアクセスするときにデータの各セグメントにロックを割り當(dāng)てます。データ、他のセグメントのデータには他のスレッドからもアクセスできます

  2. ConcurrentHashMap は各セグメントでスレッドセーフです

  3. LinkedHashMap は二重リンクリストを維持し、その中のデータは書き込むことができます シーケンシャル読み取り

ConcurrentHashMap アプリケーション シナリオ
1: ConcurrentHashMap のアプリケーション シナリオは高い同時実行性を備えていますが、同期された HashMap と HashMap はコンテナー全體をロックします。コンテナー全體をホストするには、ConcurrentHashMap をロックする必要はありません。対応するセグメントをロックするだけでよいため、高い同時同期アクセスが保証され、効率が向上します。
2: 複數(shù)のスレッドで書き込むことができます。
ConcurrentHashMap は、HashMap を複數(shù)のセグメントに分割します
1. 取得時に、最初にセグメントを見つけてから、読み取り操作のヘッド ノードを見つけます。値は揮発性変數(shù)であるため、競合狀態(tài)が発生した場合でも最新の値を読み取ることが保証されます。読み取られた値が null の場合は変更されている可能性があり、ReadValueUnderLock 関數(shù)が呼び出され、ロックが適用されます。読み取られたデータは正しいです。
2.置くとロックされてハッシュチェーンの先頭に追加されます。
3. 削除するときもロックされます。次は最終的なタイプであり、変更できないため、削除されたノードより前のすべてのノードをコピーする必要があります。
4.ConcurrentHashMap では、複數(shù)の変更操作を同時に実行できます。その鍵は、ロック分離テクノロジーの使用にあります。複數(shù)のロックを使用して、ハッシュ テーブルのさまざまなセグメントへの変更を制御します。

ConcurrentHashMap のアプリケーション シナリオは高い同時実行性を備えていますが、同期された HashMap と HashTable は、ロック後にコンテナ全體をロックする必要はなく、対応するセグメントをロックするだけで済みます。これで、高い同時同期アクセスを確保し、効率を向上させることができます。

ConcurrentHashMap は、各呼び出しがアトミック操作であることを保証できますが、複數(shù)の呼び出しもアトミック操作であることは保証されません。

VectorとArrayListの違い

ExecutorService service = Executors.... ExecutorService service = new ThreadPoolExecutor() ExecutorService service = new ScheduledThreadPoolExecutor();

ThreadPoolExecutorのソースコード解析

スレッドプール自體のステータス:

待機(jī)中のタスクキューとワーキングセット:

スレッドプールのメインステートロック:

スレッドプールの生存時間とサイズ:

1.2 ThreadPoolExecu の內(nèi)部動作原理トール
と上記の定義データが內(nèi)部でどのように実裝されているかを見てみましょう。 Doug Lea のアイデア全體は 5 つの文に要約されています:

  1. 現(xiàn)在のプール サイズ poolSize が corePoolSize より小さい場合は、タスクを?qū)g行する新しいスレッドを作成します。

  2. 現(xiàn)在のプールサイズpoolSizeがcorePoolSizeより大きく、待機(jī)キューがいっぱいでない場合、待機(jī)キューに入ります

  3. 現(xiàn)在のプールサイズpoolSizeがcorePoolSizeより大きく、maximumPoolSizeより小さい場合、待機(jī)キューに入りますがいっぱいの場合は、タスクを?qū)g行するための新しいスレッドを作成します。

  4. 現(xiàn)在のプール サイズ poolSize が corePoolSize より大きく、maximumPoolSize より大きく、待機(jī)キューがいっぱいの場合、タスクを処理するために拒否ポリシーが呼び出されます。

  5. スレッド プール內(nèi)の各スレッドは、タスクの実行後すぐには終了しません。代わりに、keepAliveTime 內(nèi)に新しいタスクを待機(jī)できない場合、実行する必要のあるスレッド タスクがあるかどうかを確認(rèn)します。 、スレッドは終了します。

Executor パッケージ構(gòu)造

CopyOnWriteArrayList: 要素を追加するときに、元のコンテナをコピーし、新しいコンテナにコピーしてから、新しいコンテナに追加します。コンテナに書き込み、書き込み後に元のコンテナの參照を新しいコンテナにポイントします。読み取り時には古いコンテナのデータが読み取られるため、同時読み取りを?qū)g行できますが、これは弱い整合性戦略です。
使用シナリオ: CopyOnWriteArrayList は、キャッシュなど、読み取り操作が書き込み操作よりもはるかに大きいシナリオでの使用に適しています。

一般的な Linux コマンド: cd、cp、mv、rm、ps (プロセス)、tar、cat (コンテンツの表示)、chmod、vim、find、ls

デッドロックの必要條件

mutual exclusionには、非共有狀態(tài)の少なくとも1つのリソースがあり、待機(jī)中のリソースは、デッドロックを解決するために待っています。最初のものはデッドロックです上記4つの條件を同時に満たすようにする。 2 つ目は、リソースを合理的に割り當(dāng)てることです。
    3 番目は、プロセスによって要求されたリソースの殘りの量がオペレーティング システムによって満たされる場合は、バンカーのアルゴリズムを使用することです。
  1. プロセス間通信方式

  2. Pipe (パイプ): パイプは、データが一方向にのみ流れることができ、関連するプロセス間でのみ使用できます。プロセス アフィニティは通常、親子プロセス関係を指します。

  3. 名前付きパイプ: 名前付きパイプも半二重通信方法ですが、無関係なプロセス間の通信が可能になります。

  4. セマフォ: セマフォは、複數(shù)のプロセスによる共有リソースへのアクセスを制御するために使用できるカウンターです。これは、プロセスがリソースにアクセスしているときに、他のプロセスが共有リソースにアクセスできないようにするロック メカニズムとしてよく使用されます。したがって、主にプロセス間、および同じプロセス內(nèi)の異なるスレッド間の同期手段として使用されます。

メッセージ キュー (メッセージ キュー): メッセージ キューは、カーネルに格納され、メッセージ キュー識別子によって識別されるメッセージのリンクされたリストです。メッセージ キューは、信號送信情報が少なく、パイプはフォーマットされていないバイト ストリームのみを伝送でき、バッファ サイズが制限されているという欠點(diǎn)を克服します。

Signal ( sinal ): Signal は、イベントが発生したことを受信プロセスに通知するために使用される比較的複雑な通信方法です。
  1. 共有メモリ: 共有メモリは、他のプロセスがアクセスできるメモリのセクションをマップすることです。この共有メモリは 1 つのプロセスによって作成されますが、複數(shù)のプロセスによってアクセスできます。共有メモリは最も高速な IPC 方式であり、他のプロセス間通信方式の非効率性に対処するために特別に設(shè)計されています。多くの場合、プロセス間の同期と通信を?qū)g現(xiàn)するために、セマフォなどの他の通信メカニズムと組み合わせて使用??されます。
  2. ソケット: ソケットは、他の通信メカニズムとは異なり、異なるマシン間のプロセス通信に使用できます。
  3. プロセスとスレッドの違いと関係
  4. オペレーティングシステムのプロセススケジューリングアルゴリズム
  5. コンピュータシステムの階層ストレージ構(gòu)造の詳細(xì)な説明

    データベーストランザクションは、単一の論理ユニットとして実行される一連の操作を指します仕事の。
  6. MySQL データベース最適化の概要

    MYSQL 最適化の一般的な方法

    MySQL ストレージ エンジン - MyISAM と InnoDB の違い
  7. SQL データベースのパラダイムについて
  8. Hibernate の 1 次キャッシュはセッションによって提供されるため、セッションのライフサイクルで、プログラムが save()、update()、saveOrUpdate() などのメソッドを呼び出し、クエリ インターフェイスのリスト、フィルター、反復(fù)を呼び出すときに、対応するオブジェクトがセッション キャッシュに存在しない場合、 Hibernate は 1 次キャッシュに追加されますが、セッションが閉じられるとキャッシュは消えます。

  9. Hibernate の 1 次キャッシュはセッションに組み込まれており、いかなる方法でもアンインストールしたり構(gòu)成したりすることはできません。エンティティ オブジェクトをキャッシュする場合、オブジェクトの主キー ID は次のとおりです。これはマップのキーであり、エンティティ オブジェクトは対応する値です。

Hibernate 2 次キャッシュ: 取得したすべてのデータ オブジェクトを ID に従って 2 次キャッシュに置きます。 Hibernate の 2 番目のキャッシュ戦略は、ID クエリのキャッシュ戦略であり、データが削除、更新、または追加されると、同時にキャッシュが更新されます。

プロセスとスレッドの違い:

プロセス: 各プロセスには獨(dú)立したコードとデータ領(lǐng)域 (プロセス コンテキスト) があり、プロセス間の切り替えには大きなオーバーヘッドが発生します。

スレッド: 同じタイプのスレッドはコードとデータ空間を共有し、各スレッドは獨(dú)立した実行スタックとプログラム カウンター (PC) を持ち、スレッド切り替えのオーバーヘッドは小さくなります。

スレッドとプロセスは、作成、準(zhǔn)備完了、実行、ブロック、終了の 5 つの段階に分かれています。

マルチプロセスとは、オペレーティングシステムが複數(shù)のタスク(プログラム)を同時に実行できることを意味します。


マルチスレッドとは、同じプログラム內(nèi)で複數(shù)のシーケンス フローを?qū)g行することを指します。

Java でマルチスレッドを?qū)g現(xiàn)するには、Thread クラスを継続する方法、もう 1 つは Runable インターフェースを?qū)g裝する方法、そして 3 つ目は Callable インターフェースを?qū)g裝する方法があります。

Switchはパラメータとして文字列を使用できますか?

a. Java 7 より前では、switch は byte、short、char、int、またはそれらに対応するカプセル化クラスと Enum 型のみをサポートしていました。 Java 7 では、文字列のサポートが追加されました。

Object のパブリック メソッドとは何ですか?

a. メソッド equals は、2 つのオブジェクトが等しいかどうかをテストします

b. メソッド clone は、現(xiàn)在のオブジェクト

に関連する Class オブジェクトを返します

メソッドは、notify、notifyall、およびwait はすべて、指定されたオブジェクトに対してスレッド同期を?qū)g行するために使用されます

Java の 4 つのリファレンス、その長所と短所、およびそれらが使用されるシナリオ

a. OOM 問題を解決するには、ソフト參照と弱參照を使用します。メモリが不足している場合、HashMap を使用して、畫像のパスと、対応する畫像オブジェクトに関連付けられたソフト參照の間のマッピング関係を保存します。これらのキャッシュされた畫像オブジェクトのスペースを再利用することで、OOM の問題を効果的に回避できます。

b. ソフトアクセス可能なオブジェクト取得メソッドを使用して Java オブジェクトのキャッシュを?qū)g裝します。たとえば、従業(yè)員の情報を毎回クエリする必要がある場合に、Employee クラスを作成する場合です。たとえほんの數(shù)秒前にクエリされたとしても、インスタンスを再構(gòu)築する必要があり、これには多くの時間がかかります。ソフト參照と HashMap を組み合わせることができます。まず、參照を保存します。従業(yè)員オブジェクトのインスタンスをソフト參照の形式で參照し、その參照を HashMap に保存します。キーは従業(yè)員の ID で、値はそのソフト參照です。一方、このオブジェクトは、參照を取り出して、キャッシュ內(nèi)に Employee インスタンスへのソフト參照があるかどうかを確認(rèn)し、存在する場合はソフト參照から取得します。ソフト參照がない場合、またはソフト參照から取得したインスタンスが null の場合は、インスタンスを再構(gòu)築し、ソフト參照を新しく作成したインスタンスに保存します。

c. 強(qiáng)參照: オブジェクトに強(qiáng)參照がある場合、そのオブジェクトはガベージ コレクターによってリサイクルされません。現(xiàn)在のメモリ空間が不十分な場合でも、JVM はメモリ空間を再利用せず、OutOfMemoryError エラーをスローし、プログラムが異常終了します。強(qiáng)參照とオブジェクト間の関連付けを解除したい場合は、JVM が適切なタイミングでオブジェクトをリサイクルできるように、參照を明示的に null に割り當(dāng)てることができます。

d. ソフト參照: ソフト參照を使用する場合、メモリ容量が十分であれば、ソフト參照はガベージ コレクターによって再利用されずに使用し続けることができます。リサイクルします。

e. 弱い參照: 弱い參照を持つオブジェクトのライフサイクルは短くなります。これは、JVM がガベージ コレクションを?qū)g行するときに、弱參照オブジェクトが見つかると、現(xiàn)在のメモリ領(lǐng)域が十分であるかどうかに関係なく、その弱參照がリサイクルされるためです。ただし、ガベージ コレクターは優(yōu)先度の低いスレッドであるため、弱い參照オブジェクトをすぐに見つけることができない場合があります。

f. 仮想?yún)⒄? 名前が示すように、オブジェクトが仮想?yún)⒄栅韦撙虮3证筏皮い雸龊稀ⅳ饯欷蠀⒄栅虺证郡胜い长趣韧趣扦ⅳ?、いつでもガベージ コレクターによってリサイクルされる可能性があります。

ハッシュコードとイコールの違いは何ですか?

a. Java コレクションには list と set の 2 種類があり、このメソッドは要素の繰り返し実裝を許可しません。要素が 1,000 個ある場合は、equal を使用して比較します。要素が同じかどうかを確認(rèn)するには、equal を 1,000 回呼び出す必要があります。これにより、効率が大幅に低下します。ハッシュコードは実際にはオブジェクトの格納アドレスを返します。この位置に要素が存在しない場合、その要素はそのすぐ上に格納されます。この時點(diǎn)で、equal メソッドが呼び出され、新しいものと比較されます。要素が同じである場合、別のアドレスに保存してハッシュすることはできません。

オーバーライドとオーバーロードの意味と違い
a. オーバーロードは、名前が示すように、クラスの多態(tài)性を表現(xiàn)できますが、パラメーター名は同じである可能性があります。 、戻り値、および型を同じにすることはできません。つまり、パラメーター、型、および戻り値は変更できますが、関數(shù)名は変更されません。
b. サブクラスが親クラスを継承する場合、サブクラスがこの関數(shù)を呼び出すと、そのサブクラスが自動的に呼び出されます。そして親クラスはオーバーライドされる(オーバーライドされる)ことと同じです。
詳細(xì)については、C++ でのオーバーロードと書き換え (上書き) の違いの分析例を參照してください。

抽象クラスとインターフェイスの違い

a クラスは 1 つのクラスのみを継承できますが、実裝することはできます。複數(shù)のインターフェース

b. 抽象クラスはコンストラクターを持つことができますが、インターフェースはコンストラクターを持つことができません

c. 抽象クラスの一部の基本メソッドを抽象クラスに実裝することを選択できます。インターフェースでは、すべてのメソッドが抽象である必要があります

。抽象クラスには靜的メソッドを含めることができますが、インターフェースには通常のメンバー変數(shù)を含めることはできません

XML の解析方法それぞれの原理と特性メソッド: DOM、SAX、PULL

a.DOM: メモリ消費(fèi): まず XML ドキュメントをメモリに読み込み、次に DOM API を使用してツリー構(gòu)造にアクセスし、データを取得します。これは非常に簡単に記述できますが、大量のメモリを消費(fèi)します。データが大きすぎて攜帯電話の性能が十分でない場合、攜帯電話が直接クラッシュする可能性があります

b.SAX: 高い解析効率、少ないメモリ使用量、イベント駆動型: より簡単に言うと、文書をスキャンするときに文書を順次スキャンします。スキャン)、要素の始まりと終わり、文書の終わりなどがイベント処理関數(shù)に通知され、イベント処理関數(shù)は対応するアクションを?qū)g行し、文書の終わりまで同じスキャンを続けます。

c.PULL: SAX と同様に、イベント駆動型でもあり、次の解析イベント (つまり、開始ドキュメント、終了ドキュメント、開始タグ、終了タグ) を取得するために next() メソッドを呼び出すことができます。特定の要素で XmlPullParser の getAttributte() メソッドを呼び出して屬性の値を取得するか、その nextText() を呼び出してこのノードの値を取得できます。

wait() と sleep() の違いは

sleep は Thread クラスに由來し、wait は Object クラスに由來します

sleep() メソッドの呼び出し中、スレッドはオブジェクトのロックを解放しません。 wait メソッドを呼び出すスレッドはオブジェクトのロックを解放します

sleep はスリープ後にシステム リソースを放棄しませんが、他のスレッドが CPU を占有する可能性があります

スリープ時間 (ミリ秒) を指定する必要があります。時間になると自動的に起動します

JAVA ヒープとスタックの違い、Java のメモリメカニズムについて話しましょう

a. 基本的なデータ型、変數(shù)、オブジェクト參照はすべてスタックに割り當(dāng)てられます

b。 new

によって作成されたオブジェクトと配列を保存するために使用されます c. クラス変數(shù)(靜的によって変更された変數(shù))、プログラムはロードされるとすぐにヒープ內(nèi)のクラス変數(shù)にメモリを割り當(dāng)て、ヒープ內(nèi)のメモリアドレスが保存されますスタック

d 內(nèi)のインスタンス変數(shù): Java キーワード new を使用すると、システムが必ずしも連続的ではないヒープ內(nèi)の領(lǐng)域を解放し、それを変數(shù)に割り當(dāng)てるとき、それは分散ヒープ メモリ アドレスに基づいて変換されます。ハッシュ アルゴリズムを使用して、ヒープ內(nèi)の変數(shù)の「物理的位置」を表す一連の數(shù)値 – インスタンス変數(shù)への參照が失われると、そのインスタンス変數(shù)は再利用可能な「リスト」に含まれます。 GC (ガベージ コレクター) ですが、ヒープ內(nèi)のメモリはすぐには解放されません

e. ローカル変數(shù): 特定のメソッドまたは特定のコード セグメント (for ループなど) で実行されるときに、メモリはスタック上に割り當(dāng)てられます。ローカル変數(shù)がスコープ外になると、メモリはすぐに解放されます

JAVA ポリモーフィズムの実裝原理

a送信者によって動作が異なります。 (メッセージの送信は関數(shù)呼び出しです)

b. 実裝原理は動的バインディングであり、プログラムによって呼び出されるメソッドは実行時に動的にバインドされます。パラメーター。

関連する推奨事項:

Java コレクションの面接の質(zhì)問と回答のまとめ

Java のクラスのロード順序の分析 (面接の質(zhì)問でよく使用されます)

以上が大手企業(yè)のJava面接質(zhì)問まとめ(全て)の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go 言語の面接でよくある 5 つの質(zhì)問と回答 Go 言語の面接でよくある 5 つの質(zhì)問と回答 Jun 01, 2023 pm 08:10 PM

近年非常に人気が高まっているプログラミング言語として、Go言語は多くの企業(yè)や企業(yè)の面接で注目の的となっています。 Go 言語の初心者にとって、面接プロセス中に関連する質(zhì)問にどのように答えるかは、検討する価値のある問題です。初心者向けに、Go 言語の面接でよくある 5 つの質(zhì)問と回答を示します。 Go言語のガベージコレクションの仕組みを紹介してください。 Go 言語のガベージ コレクション メカニズムは、マーク スイープ アルゴリズムと 3 色マーキング アルゴリズムに基づいています。 Go プログラムのメモリ容量が足りない場合、Go ガベージ コレクターが

2023 年のフロントエンド React 面接の質(zhì)問の概要 (コレクション) 2023 年のフロントエンド React 面接の質(zhì)問の概要 (コレクション) Aug 04, 2020 pm 05:33 PM

有名なプログラミング學(xué)習(xí) Web サイトとして、php 中國語 Web サイトは、フロントエンド開発者が React 面接の障害を準(zhǔn)備してクリアできるように、React 面接の質(zhì)問をいくつかまとめています。

2023 年 Web フロントエンド面接厳選質(zhì)疑応答完全集(コレクション) 2023 年 Web フロントエンド面接厳選質(zhì)疑応答完全集(コレクション) Apr 08, 2021 am 10:11 AM

この記事では、Web フロントエンドの面接で収集する価値のある質(zhì)問をいくつか抜粋してまとめています (回答付き)。一定の參考値があるので、困っている友達(dá)が參考になれば幸いです。

マスターしなければならない 50 の Angular 面接の質(zhì)問 (コレクション) マスターしなければならない 50 の Angular 面接の質(zhì)問 (コレクション) Jul 23, 2021 am 10:12 AM

この記事では、Angular の面接でマスターすべき 50 の質(zhì)問を初級、中級、上級の 3 つのパートに分けて分析し、徹底的に理解するのに役立ちます。

2023 年の Vue の高頻度面接質(zhì)問の共有 (回答分析付き) 2023 年の Vue の高頻度面接質(zhì)問の共有 (回答分析付き) Aug 01, 2022 pm 08:08 PM

この記事では、2023 年の vue の高頻度面接で収集する価値のある?yún)椷xされた質(zhì)問 (回答付き) をまとめています。一定の參考値があるので、困っている友達(dá)が參考になれば幸いです。

インタビュアー: 高同時実行性についてどのくらい知っていますか?私:うーん... インタビュアー: 高同時実行性についてどのくらい知っていますか?私:うーん... Jul 26, 2023 pm 04:07 PM

高い同時実行性は、ほぼすべてのプログラマーが望んでいるエクスペリエンスです。理由は簡単です。トラフィックが増加すると、インターフェイスの応答タイムアウト、CPU 負(fù)荷の増加、頻繁な GC、デッドロック、大規(guī)模なデータ ストレージなど、さまざまな技術(shù)的問題が発生するためです。これらの問題は、技術(shù)の深さの継続的な改善を促進(jìn)することができます。

Alibaba ターミナル: 1 日あたり 100 萬回のログイン リクエスト、8G メモリ、JVM パラメータを設(shè)定するにはどうすればよいですか? Alibaba ターミナル: 1 日あたり 100 萬回のログイン リクエスト、8G メモリ、JVM パラメータを設(shè)定するにはどうすればよいですか? Aug 15, 2023 pm 04:31 PM

つい先週、Alibaba Cloud の技術(shù)面接中にクラスメートが次の質(zhì)問をされました。1 日あたり 100 萬回のログイン リクエストがあるプラットフォームと 8G メモリを搭載したサービス ノードを想定すると、JVM パラメータはどのように設(shè)定すればよいでしょうか?答えが理想的ではないと思われる場合は、私にレビューを依頼してください。

2023 年の最新の PHP 面接の質(zhì)問 28 件を共有します (回答付き) 2023 年の最新の PHP 面接の質(zhì)問 28 件を共有します (回答付き) Mar 03, 2022 pm 01:20 PM

この記事は、基礎(chǔ)知識を整理するための PHP 面接の質(zhì)問 28 問 (回答付き) をまとめて共有しています。一定の參考価値があります。困っている友人は參照してください。皆様のお役に立てれば幸いです。

See all articles