これはほとんど(火の上の既知の問題ですwww.zhihu.com/question/50 ...
オリジナルの答え
この問題は、単にああ、熱い体のみオープンフィールドです。
StringBufferを、StringBuilderの差は何ですか?
スレッドセーフとは何ですか?
スレッドの安全性を確保するには?
ロックとは何ですか?デッドロック?
同期の原則の実現は何ですか?
同期化するだけでなく、揮発性のでしょうか?
それがどのように最適化するために、ロックを同期?(ロック粗大?ロックが解消?ロックをスピン?偏ったロック?軽量ロックを?)
JMMはそれを知っていますか?(不可分?可視性?秩序あります?)
Javaとの契約は知っていますか?
だから、フェイルファスト何ですか?フェイルセーフとは何ですか?
コピーオンライトとは何ですか?
AQSそれですか?CASそれですか?
CASは楽観的ロックが知らなければならないことを、知っていますか?
どのような楽観的ペシミスティック・ロック差をロックしているのですか?
データベース悲観的ロックと楽観的ロックを実装するには?
データベースのロックはそれを理解できますか?行レベルロック?テーブル・レベルのロッキング?共有ロック?排他ロック?ギャップロック?ネクストキーロック?
データベースのロックと分離レベルを行うには何がありますか?
データベースのロックとインデックスの関係は何ですか?
クラスタ化インデックスとは何ですか?非クラスタ化インデックス?最も左接頭語は何ですか?B +ツリーインデックス?共同インデックス?戻るテーブルへ?
分散ロックはそれを理解できますか?
分散ロックを達成するためにどのようにRedisの?
なぜ、Redisのを使うのか?
Redisのとmemcacheの違いは何ですか?
飼育係は、達成するためにどのようにロックを分散しましたか?
飼育係は何ですか?
CAPとは何ですか?
BASEとは何ですか?そして、CAPの違いは何ですか?
CAPは、どのように導出しますか?どのように選択するには?
どのようにデータの一貫性を確保するために、分散型システム?
分散トランザクションとは何ですか?分散トランザクションプログラム?
だから、最終的には、右、スレッドセーフなシングルトンを手書き来ますか?
同期とスレッドセーフなロックシングルトンにそれを実現しませんか?
あなたは、この上に答えることができますか?さて、あなたは右、パクシアルゴリズムが何であるかを私に説明しますか?
卒~!
その答えの一部
上記の問題を解決するために、私はいくつかの答えを与えるだろう、私はあなたが何かを学ぶ願っています。これらの答えはまた、歴史のうち、私のブログの記事から要約されています。
問題の一部は、簡単ないくつかの単語をはっきり言うことができる、私は答えを掲載う、より複雑な、私はポータルを掲載しています。
ただし、以下のような比較のいくつかの種類として完全な答え、ではないかもしれないが、私は唯一のキーポイントとフォーカスや知識について言うことができますので、私は読者が以下の質問、すべての質問には完璧な答えに応じことができると思います。
StringBufferを、StringBuilderの差は何ですか?
StringBufferのは、スレッドセーフですが、StringBuilderのは、スレッドセーフではありません。
スレッドセーフとは何ですか?
ライブラリが正しく、複数のスレッド間で共有変数扱うプログラム機能が正常に完了させることができ、同時環境呼び出されたときに、スレッドの安全性は、長期的なプログラミングは関数を参照です。つまり、マルチスレッドのシナリオで、整然とした、アトミック性と視認性の問題は発生しません。
スレッドの安全性を確保するには?
Javaは、主にロックを通じてスレッドの安全性を実現しています。通常、同期とロック
ロックとは何ですか?デッドロック?
デッドロックは、外部の力なしで、彼らはそれを促進することができなくなり、によるリソースの競合または起因互いに通信引き起こされるブロッキング現象を、実装プロセス内の2つの以上のプロセスを指します。この時点で、システムがデッドロック状態やデッドロックと呼ばれる別のプロセスを待っているの過程で常にデッドロックを生成するためのシステムであると言います。
デッドロックは、次の4つの要件を満たしている必要があります。相互に排他的な条件、要求を条件ではなく、剥奪、ループ待ち状態を保ちます
デッドロックの解決策は、これらの4つの基本的な条件の一つ以上を破壊することです。
同期の原則の実現は何ですか?
マルチスレッド(A)の深い理解-の原則の同期実現 の深い理解は、マルチスレッド(4)は-原則Moniterの実現の 時間誰かが、あなたがこの記事を置くために彼に発行された同期ものを尋ねます
同期化するだけでなく、揮発性のでしょうか?
揮発性が、多くの場合、「軽量同期」と比較され、視認性と秩序の実装原理を保証することができる不揮発性メモリバリアによって実装されます。
揮発性は、重要な役割を持っている必要はありません同期され、それは、命令の並べ替えを禁止されています。この機能は、ときsynchronizedキーワードの使用もののことを実現するのに便利ダブルチェックロックのシングル場合、それは揮発性のシングルトンオブジェクトを変更されていない場合、それが問題になる可能性があります。
Javaでvolatileキーワードの深さを理解 して、誰かがそう、彼に発行した記事を置く同期何をお願いします。
それがどのように最適化するために、ロックを同期?(ロック粗大?ロックが解消?ロックをスピン?偏ったロック?軽量ロックを?)
マルチスレッドの深い理解(5) - Java仮想マシンの最適化技術をロック
JMMはそれを知っていますか?(不可分?可視性?秩序あります?)
Javaのメモリモデル(Javaのメモリモデル、JMM)は、さまざまなプラットフォームでJavaプログラムがメモリにアクセスすることを保証するために、ハードウェアとオペレーティングシステムのアクセスの様々な違いを遮蔽し、メモリモデルの仕様に沿っている一貫した結果を保証することができますメカニズムや規範。
その後、誰かがあなたに彼に発行した記事を入れてどのようなJavaのメモリモデルを尋ねました。
Javaとの契約は知っていますか?
java.util.concurrentのパッケージ(JUC)は、いくつかの部品を備え、いくつかの有用なツールのJavaの並行プログラミングに含ま:
図1に示すように、ロック部:パッケージに含まれているjava.util.concurrent.locksは、明示的なロック(相互排他ロックとスケッチ)関連機能が提供されます。
図2に示すように、原子部品:アトミック変数クラス関連提供される機能に含まは、java.util.concurrent.atomicパッケージには、アルゴリズムは、非ブロッキングのための基礎です。
3、エグゼキュータ部:散乱java.util.concurrentパッケージ、関連する機能を提供するために、スレッドプール。
4、コレクションパート:コンカレント・コンテナーに関連する機能を提供し、java.util.concurrentパッケージ散乱。
図5に示すように、ツール部:散乱java.util.concurrentパッケージ、例えばセマフォ、ブロッキング、フェンスなどのような同期ツールを提供します。
だから、フェイルファスト何ですか?フェイルセーフとは何ですか?
我々は通常、Javaで言うフェイルファストメカニズムは、デフォルトでは、Javaのエラー検出機構の集まりを指します。複数のスレッドが構造変化のコレクションの一部を操作するときは、フェイルファストメカニズム、それはConcurrentModificationExceptionをスローします。この時間をそこに持っていることがあります。
ConcurrentModificationExceptionが、物体の検出同時変更が、そのような変更をスローすることが許可されていません。
異常が生じ、フェイルファストメカニズムをトリガしないようにするために、我々は、Javaコレクションクラスで提供フェイルセーフメカニズムのいくつかの使用を使用することができます。
この回収容器は、コレクションのコピーに横断するために、横断中のコレクションの内容に直接アクセスすることはできませんが、コレクションの元の内容の最初のコピー。
容器はjava.util.concurrentのパッケージ内に、同時マルチスレッド、同時の修飾に使用することができるフェイルセーフです。また、foreachの中に追加/削除することができます。
コピーオンライトとは何ですか?
短いCOWをコピー・オン・ライト、それはプログラムの設計のための最適化戦略です。基本的な考え方は、我々はすべて同じ内容を共有し、最初から、誰かが内容を変更したい場合、コンテンツのコピーが実際にコンテンツの新しい形を出して、その後、変更、怠惰な遅延であるということです戦略。
コピー・オン・ライト容器であるコピーオンライト・コンテナ。あなたは要素を追加した後で人気の理解は、私たちがコンテナに要素を追加する場合、直接現在のコンテナに追加しますが、最初に現在のコンテナをコピーし、新しいコンテナをコピーし、新しいコンテナ要素を追加していないということです、その後、元の容器の参照は、新しいコンテナを指します。
AQSそれですか?CASそれですか?
AQS(AbstractQueuedSynchronizer)、すなわち、キュー同期。ロックや、JUCと契約著者(ダグ・リー)(例えばReentrantLockの、ReentrantReadWriteLock、セマフォなど)他の同期コンポーネントを構築、同期の要件のほとんどを達成するための基礎であることを期待するための基本的なフレームワークです。これは、JUCとコアの基本的なコンポーネントを収縮です。
CASは、複数のスレッドが同じ変数を更新同時にCASを使用しようとすると、唯一のスレッドが変数の値を更新することができ、用語楽観的ロックの技術であり、他のスレッドが失敗した、スレッドの失敗は中断されるが、されません障害が競争を知らせるために、あなたはもう一度試すことができます。
CAS操作は3つのオペランド含む - メモリ位置(V)を、元の値(A)と新たな値(B)と期待されます。元の値のメモリ位置が期待値と一致する場合、プロセッサは、自動的に新しい値に位置値を更新します。そうでない場合、プロセッサは何もしません。いずれの場合も、CAS命令前の位置の値を返します。(いくつかの特殊なケースでCAS CASは、現在の値を抽出することなく、成功した場合にのみ返されます。)CASが効果的に、私は場所が値V Aが含まれているべきだと思う」、説明;この値が含まれている場合、この位置にあるBプットを、それ以外の場合は、ちょうどこの場所の値が今。「実際には、この原則競合チェックと楽観的ロック+データの更新が同じであることができますを教えて、場所を変更しないでください。
CASは楽観的ロックが知らなければならないことを、知っていますか?
競合が見つかった場合はオプティミスティック・ロック(オプティミスティック・ロック)比較的悲観的ロック、ロックは通常の状況下でのデータ競合が発生しないという楽観的な仮定は、そう、正式な紛争前に更新提出するか、データをデータでは検出されない時も、その後、ユーザーが何をすべきかを決定することができ、ユーザーはエラーメッセージを返してみましょう。
ペシミスティック・ロックに対する、データベース処理、及びデータベースによって提供される楽観的ロックのロック機構を使用しないと。一般的な実装楽観的ロックの方法は、データのバージョンを記録することです。
2つの方法でデータのバージョンは、第1、第2のタイムスタンプを使用することで、バージョン番号を使用することです。
どのような楽観的ペシミスティック・ロック差をロックしているのですか?
同上
データベース悲観的ロックと楽観的ロックを実装するには?
データベースのロックはそれを理解できますか?行レベルロック?テーブル・レベルのロッキング?共有ロック?排他ロック?ギャップロック?ネクストキーロック?
MySQLで行レベルのロック、テーブルレベルロック、ページレベルのロック
データベースのロックと分離レベルを行うには何がありますか?
多くのDBMSは、ロックを制御するために、異なるレベルおよび並行「トランザクション分離レベル」の数を定義します。
ANSI / ISO標準SQLでは、最終的に高いから4つの分離レベルを定義した:(シリアライズ)シリアライズ反復可能読み取り(反復可能読み取り)、コミットを読む(コミット読む)、非コミット読み取り(非コミット読み取り)。
データベースのロックとインデックスの関係は何ですか?
MySQLでは、行レベルのロックを直接レコードロックが、ロック指標ではありません。索引SQL文の場合、主キーのインデックスの操作の2つです、MySQLはこの主キーのインデックスをロックするメインキーインデックスと非主キー索引に分け、非プライマリキーインデックスの操作if文、MySQLは最初の非プライマリキーインデックスをロックします、その後、ロックされました主キーのインデックスに関連します。
クラスタ化インデックスとは何ですか?非クラスタ化インデックス?最も左接頭語は何ですか?B +ツリーインデックス?共同インデックス?戻るテーブルへ?
主キーインデックスのリーフノードは、データの行全体を格納されています。InnoDB内で、また、主キー索引クラスタリングインデックス(クラスタ化インデックス)と呼ばれます
主キーインデックスの非リーフノードの内容はInnoDB内で、非プライマリキーインデックスは、非クラスタ化インデックス(セカンダリインデックス)と呼ばれ、主キーの値であります
我々は、(KEY1、KEY2、KEY3)として時間の関節指数、(KEY1)、(KEY1、KEY2)及び(KEY1、KEY2、KEY3)3つのインデックスを作成するための等価物を作成する場合、これは最も左マッチング原理です。
InnoDB内で、B +ツリーインデックスのリーフノードは、データの行全体が主キーインデックスである格納します。そして、インデックスB +ツリーのリーフノードは、主キー索引の非プライマリキーの値を格納します。主キー索引ツリーのリーフノードが全体のラインがあるので、直接私たちが望むデータを照会。主キー索引のリーフ・ノードは、主キーの値であるのではなく、後に見つかった主キーの値は、まだこのプロセスがテーブルに戻って呼ばれ、主キーの値によって別のクエリを作成する必要があります。
私はアリのインタビュアーに会ったまで、私は、MySQLのインデックスについて多くを知っていると思います
分散ロックはそれを理解できますか?
今一般的に使用される次のオプションは以下のとおりです。
飼育係に基づく分散ロック・データベースの実装の実装がロックキャッシュを分散(のRedis、memcachedの、TAIR)分散ロックの実装に基づいて
分散ロックを達成するためにどのようにRedisの?
Redisの複数のプロセスには、次のコマンドを実行します。
SETNXのlock.foo
SETNXプロセスがロックを取得することを示し、1が返された場合、キーlock.fooのSETNXタイムアウト設定の値(現在時刻+アクティブ・ロック)がロックされます。SETNXロックが他のプロセスによって得られたことを示す、0を返す場合、プロセスは、クリティカル領域に入ることができません。プロセスがロックを取得するためにSETNXがループで動作しようとし続けることができます。
なぜ、Redisのを使うのか?
パフォーマンスを向上させるための分散キャッシュ
Redisのとmemcacheの違いは何ですか?
1、ストレージ:Memcacheの全てのデータがメモリに存在し、データは、メモリサイズを超えないようにすることができ、停電後ハングします。Redisのは、あなたが再起動するために再び使用することができ、負荷、メモリ内のデータをディスクに保存することができ、データの永続性をサポートしています。(RDB AOFログは、2つのスナップショットと永続的な方法を示しています)。
2、Redisのは、バックアップデータのバックアップをサポートし、マスタースレーブモードデータ。
3、データ型サポート:RedisのMemcacheのデータのサポートのよりもはるかに。
別の基礎となるモデルを使用して4は、:、その後、システムコールを移動するためのいくつかの時間を無駄にし、一般的なシステム機能を要求しますので、RedisのVMの新しいバージョンでは、自分の直接のメカニズムを構築します。
飼育係は、達成するためにどのようにロックを分散しましたか?
分散ロック・飼育係の一時的な順序ノードを達成することができます。
一般的な考え方である:各クライアントは、特定のメソッドをロックするために、飼育係法上のノードに対応する指定されたディレクトリには、瞬時に注文したユニークなノードを生成します。ロックを取得するかどうかを決定することは非常に簡単であり、順序付けられたノードの最小限決意番号を必要とします。ロックが解除された場合は、単にこのノードを削除することは、瞬間することができます。同時に、それはロックによって引き起こされるサービスのダウンタイムを解放することができず、デッドロックが作成さ回避します。
飼育係は何ですか?
飼育係分散サービスのオーケストレーションコンポーネントはオープンソースであり、Googleのチャビーのオープンソース実装です。高性能な分散データの一貫性のソリューションです。彼は、プリミティブの高効率で信頼性の高いセットを形成するために一緒に分布するサービスパッケージの複雑な、エラーが発生しやすい一貫こと、およびユーザーに使いやすいインターフェースを提供していますでしょう。
CAPとは何ですか?
CAP理論:分散システムは、たった3つの二つに一貫性(一貫性)、可用性(アベイラビリティ)とパーティションのフォールトトレランス(パーティションの許容範囲)を満たすことができます。
BASEとは何ですか?そして、CAPの違いは何ですか?
BASEのCAP理論は理論の拡張である、そうであっても強い整合を行うことができない場合には核となるアイデアは、(強い一貫性を、CAPの一貫性が強い整合性である)されていることが、適切な方法の適用は、最終的な一貫性(最終的Consitency)に到達するために使用することができます。
利用できる基本的なBASE(基本的には利用可能)、ソフト状態(ソフトステート)、最終的一貫性(結果整合性)を指します。
CAPは、どのように導出しますか?どのように選択するには?
これは妥協シナリオのヒントを含まないお金のために、Cが保証されなければなりません。ネットワーク障害はかなりA.を放棄し、CPを保証されたサービスを、停止します 例えば、数年前にアリペイケーブルWaduanイベント、ネットワーク障害、アリペイの可用性と、選択したデータの一貫性との間でデータの一貫性、Alipayのユーザーが長時間システムダウンを感じるが、実際には背後数え切れないほどのエンジニアがデータ数の一貫性を確保するために、データを回復します。
他のシーンのために、より多くの一般的な方法は、パーティションの可用性とフォールトトレランスを選択する強い整合性、データのセキュリティを確保するための次善の策の最終的な一貫性を与えることです。
どのようにデータの一貫性を確保するために、分散型システム?
分散トランザクション
分散トランザクションとは何ですか?分散トランザクションプログラム?
分散トランザクションは、トランザクションが複数のデータベースを操作する必要があります。実際には、同じ概念は、複数のライブラリへのデータベース・トランザクション・トランザクションに展開されます。目的は、分散システムにおけるデータの一貫性を確保することです。キーは、(すべてのコミットまたはロールバック)一貫した結果を生成しなければならないトランザクション処理は、トランザクションの決定をコミットまたはロールバック、すべてのアクションは、任意のトランザクション作ら場所を知るための方法である必要があります配布されます
分散トランザクションについては、2相コミット、第三コミットプロトコル
分散トランザクションソリューション - 柔軟な取引やサービスモデル
だから、最終的には、右、スレッドセーフなシングルトンを手書き来ますか?
なぜ私はあなたがシングルトンを達成するために、壁ひび割れ列挙体を使用することをお勧めします
同期とスレッドセーフなロックシングルトンにそれを実現しませんか?
CAS(AtomicReference)シングルモード例手段:
public class Singleton {
private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<Singleton>();
private Singleton() {}
public static Singleton getInstance() {
for (;;) {
Singleton singleton = INSTANCE.get();
if (null != singleton) {
return singleton;
}
singleton = new Singleton();
if (INSTANCE.compareAndSet(null, singleton)) {
return singleton;
}
}
}
}
复制代码
CASは、それは追加の消費のロック・スレッドの切り替えとブロックに対する相対ではなく、基盤となるハードウェアの実装依存に基づいてビジーウェイトアルゴリズムであり、より大きなサポートすることができ、スレッドの安全性を確保するために、伝統的なロックの使用を必要としないCASを使用する利点並列度。重要な欠点は、CASが正常にビジーウェイトを(無限ループになって)実行された場合、より大きなCPUの実行のオーバーヘッドを引き起こすということです。
スレッドセーフなシングルトンを実装する方法、同期とロックを使用しないでください?
スレッドセーフなシングルトンを実装する方法、同期とロックを使用しないでください?(二)
あなたは、この上に答えることができますか?さて、あなたは右、パクシアルゴリズムが何であるかを私に説明しますか?
ワン合同Paxosアルゴリズムは、メッセージングをベースとし、非常に寛容な特性をフォールト。Paxosアルゴリズムは、アルゴリズムを理解することが最も難しいと知られています!!!
概要
インタビューは、実際には、漸進的なプロセスであり、インタビュアーが手のラインとのPaxosインタビュアーアルゴリズムを任せることはできない、の合計は、最初の簡単な質問を投げ、その後、状況に応じて面接にお答えし、徐々に拡大し、深めました。
また、上記の問題のプロセスを「解体」、実際には、知識の完全なシステムは、バックグラウンドで多くの人々と私の公共のマイクロ文字の友人の数は、知識が何であるかを最終的に独自のシステムを構築する方法についての知識を私に尋ねました。
この質問と標準的な答えはありませんが、常に知識の本体である、お互いにもっと接続された知識のポイントを拡大し、また知識のポイントです。誰もが知識の同じボディではありません。しかし、ビルドプロセスがあなたのために適しているかを確認する「幅優先探索」つまり、グラフ理論「深さ優先探索」と、同じです。