0、トピックの概要
3、キーワード
3.1、待つ、寝る、通知する、notifyAll
1、sleep和wait的区别,sleep会不会释放锁
- 追问1:sleep会不会释放锁?
2、notify和notifyAll的区别
- 追问1:为什么notify()可能会导致死锁,而notifyAll()则不会?
3.2、同期、揮発性、リエントラントロック
1、可重入锁的可重入性是什么意思,哪些是可重入锁?
2、synchronized和ReentrantLock有什么区别呢?【第15讲】(*3)
3、synchronized底层如何实现?(*4)什么是锁的升级、降级?【第16讲】
- 追问1:Synchronized对于非静态方法和静态方法加锁的区别是什么?
- 追问2:Java 使用Synchronized关键字有什么隐患?
- 追问3:Synchronized和lock的区别(*3)
4、ReentrantLock底层实现原理(*2)
5、Java读写锁,
- 追问1:为什么并发读要加锁?
6、Volatile产生背景、作用(*2)
- 追问1:Volatile怎么保证可见性?
- 追问2:Volatile怎么保证有序性?
- 追问3:应用场景?变量不断加一,是否能够并发加正确
- 追问4:底层如何实现?
7、Volatile和Synchronized的区别
3、キーワード
3.1、待つ、寝る、通知する、notifyAll
1.スリープと待機の違い、スリープはロックを解除します
-
スリープの使用方法はThreadクラスのメソッドであり、ロックとは関係ありません。
waitはObjectのトップクラスのメソッドであり、ロックメカニズムのnotifyおよびnotifyAllと一緒に使用されます。 -
例外に関して、
sleep()は例外をキャッチする必要がありますが、wait()は例外をキャッチする必要はありません。 -
CPUは
sleep()を占有してCPUリソースを解放しますが、ロックリソースは解放しません。
wait()はCPUリソースを解放し、ロックリソースも解放します。 -
本質的な違い
sleep()はスレッドの実行状態制御であり、wait()はスレッド間の通信です。
フォローアップ1:睡眠はロックを解除しますか?
[外部パッケージが同期されました]いいえ、CPUリソースを解放するだけですが、ロックリソースは解放されません。
2.notifyとnotifyAllの違い
うのnotifyAllすべて のプールのために待機中のスレッドロックプール競合ロックの機会に、
通知がされますランダムに選択する競合ロック機会にプールを入力してロックを待機するスレッドプールを。
补充:
1、锁池
假设线程A已经拥有了某个对象ObjectA(不是类)的锁,而其他线程B,C想要调用这个对象的某个sychronized方法(或者块)。
线程必须先获得该对象锁的拥有权,才能进入对象的的synchronized方法。
但是ObjectA的锁正被线程A拥有,所以线程B、C会被阻塞,进入一个地方【对象锁池】去等待锁释放。
简要理解,锁池就是 线程 获取锁进行等待的地方。
2、等待池
假设线程A调用了某个对象ObjectA的wait方法,线程A就会释放对象的锁;同时线程A就进入ObjectA的等待池,进入等待池中的线程不会去竞争ObjectA的锁
重点:锁池和等待池都是针对对象。
フォローアップ1:notify()でデッドロックが発生するのに、notifyAll()では発生しないのはなぜですか?
notifyAllは、ロックプールがロック競合に参加するのを待っているプールによって移動されたすべてのスレッドが正常に続行し、失敗した場合は、ロックが解放されて再び競合した後、ロックを待機してプールに留まり、1つのスレッドのみをウェイクアップするように通知します。デスロックにつながる。
3.2、同期、揮発性、リエントラントロック
Javaメモリモデル(JMM)は、作業メモリ(ローカルメモリ)とメインメモリ間のデータ同期プロセスに作用し、次の図に示すように、データ同期を実行する方法とタイミングを指定します。
1.再入可能ロックの再入可能とはどういう意味ですか?また、どの再入可能ロックですか?
再入可能:正しく再利用できます。
再入可能ロック:同期および再入可能ロック。
(待消化确认)可重入锁:自己可以再次获取自己的内部锁。比如,一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁时,还可以再获取的;如果不可锁重入的话,就会造成死锁;同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时,才能最终释放锁。
2.同期とReentrantLockの違いは何ですか?【講義15】(* 3)
[1]同じ:両方とも再入可能ロックであり、両方とも相互排除セマンティクスを提供します。スレッドが現在のロックを取得すると、取得しようとしている他のスレッドはそこで待機またはブロックすることしかできません。
[2]違い
- 同期はJVMに依存し、ReentrantLockはAPIに依存します。
- ReentrantLockは、待機を中断できる、公正なロックを実現できる、選択的な通知を実現できる(ロックを複数の条件にバインドできる)という3つの機能を追加します。
[3]パフォーマンス:一般化することはできません。同期の初期のパフォーマンスはまったく異なり、後続のバージョンではさらに改善されており、競争の少ないシナリオではReentrantLockよりもパフォーマンスが向上する可能性があります。
补充:
0、Lock接口比synchronized锁定操作更广泛、更灵活。可以具有完全不同的属性,并且可以支持多个关联的Condition条件对象。
1、ReentrantLock锁比synchronized更具扩展性,灵活高效,额外具有嗅探锁定、多路分支通知等功能;
2、Lock接口提供比synchronized更广泛与灵活的操作;
3、Condition给ReentrantLock提供了等待/通知,而且相比synchronized中函数(wait,notify,notifyAll)更加灵活性,还可以实现多路通知功能,
3.同期された最下層を実現するにはどうすればよいですか?(* 4)ロックのアップグレードとダウングレードとは何ですか?【レクチャー16】
同期されたコードブロックは、monitorenter / monitorexit命令のペアによって実現され、Monitorオブジェクトは同期の基本的な実現単位です。
Java 6より前は、Monitorの実装は、オペレーティングシステム内の相互排他ロックに完全に依存していました。ユーザーモードからカーネルモードに切り替える必要があるため、同期操作は差別化されていない重量級の操作でした。
最新の(Oracle)JDKでは、JVMはこれを大幅に改善し、3つの異なるモニター実装を提供します。これは、バイアスロック、軽量ロック、および重量ロックの3つの異なるロックと呼ばれることがよくあります。
いわゆるロックのアップグレードとダウングレードは、JVMが同期操作を最適化するメカニズムです。JVMがさまざまな競合条件を検出すると、適切なロック実装に自動的に切り替わります。この切り替えは、ロックのアップグレードまたはダウングレードです。
競合がない場合、デフォルトでスキューロックが使用されます。JVMはCAS操作(コンペアアンドスワップ)を使用して、オブジェクトヘッダーのマークワード部分にスレッドIDを設定し、オブジェクトが現在のスレッドにバイアスされていることを示します。したがって、実際のミューテックスロックは含まれません。この仮定は、多くのアプリケーションシナリオで、ほとんどのオブジェクトがライフサイクル中に最大で1つのスレッドによってロックされるという事実に基づいています。スキューロックを使用すると、競合のないオーバーヘッドを減らすことができます。
別のスレッドがスキューされたオブジェクトをロックしようとすると、JVMはスキューされたロックを取り消して、軽量ロックの実装に切り替える必要があります。軽量ロックは、CAS操作のMark Wordに依存してロックの取得を試みます。再試行が成功した場合は、通常の軽量ロックが使用されます。それ以外の場合は、さらに重量ロックにアップグレードされます。
Javaはロックダウングレードを実行しないという意見に気づきました。実際、私が知る限り、ロックのダウングレードは発生します。JVMがセーフポイント(SafePoint)に入ると、アイドル状態のモニターがあるかどうかを確認してから、ダウングレードを試みます。
フォローアップ1:Synchronizedによる非静的メソッドのロックと静的メソッドの違いは何ですか?
1)非静的メソッドを変更すると、実際にはメソッドを呼び出すオブジェクトがロックされます。これは一般に「オブジェクトロック」と呼ばれます。
2)静的メソッドの変更は、実際にはこのタイプのオブジェクトをロックすることであり、一般に「クラスロック」として知られています。
同期非静的メソッドは、実際には現在のオブジェクトのインスタンスオブジェクトをロックします。同時にインスタンスの同期方法にアクセスできるスレッドは1つだけですが、複数のインスタンスの同期方法の場合、異なるインスタンス間の同期方法へのアクセスは同期の影響を受けません(同期同期の失敗)。
静的メソッドを同期すると、ロックはインスタンスオブジェクトではなくクラスオブジェクトであるため、静的メソッドのロックはグローバルロックであり、同期もグローバル同期であることが理解できます。
同期された変更されたオブジェクト | 非静的メソッド | 静的メソッド |
---|---|---|
ケース1 | 同じオブジェクトが2つのスレッドでそれぞれオブジェクトにアクセスするための2つの同期メソッド | クラスを使用して、2つの異なる同期メソッドを直接呼び出します |
結果 | 相互に排他的 | 相互に排他的 |
理由 | オブジェクトロック。オブジェクトが同期を呼び出すと、他の同期メソッドは実行が完了するまでロックを解放せず、実行します。 | クラス(.class)ロック。クラスオブジェクトは1つだけで、スペースは1つだけ使用されます。N個の部屋とロックがあることがわかりますので、部屋(同期方式)は相互に排他的でなければなりません。 |
ケース2 | 異なるオブジェクトが2つのスレッドで同じ同期メソッドを呼び出す | クラスの静的オブジェクトを使用して、静的メソッドまたは非静的メソッドを呼び出します |
結果 | 相互に排他的ではありません | 相互に排他的 |
理由 | オブジェクトロック、ここに2つのオブジェクトがあります。メソッドは同時に実行でき、相互に排他的ではありません。この画像は、各スレッドがメソッドを呼び出すと、オブジェクトが新しくなり、2つのスペースと2つのキーが表示されることを示しています。 | オブジェクト呼び出しなので、同上 |
ケース3 | - | オブジェクトは、2つのスレッドでそれぞれ静的同期メソッドと非静的同期メソッドを呼び出します |
結果 | - | 相互に排他的 |
理由 | - | オブジェクト呼び出しですが、2つのメソッドのロックタイプは異なります。呼び出された静的メソッドはクラスオブジェクトによって呼び出されます。つまり、2つのメソッドは同じオブジェクトロックを生成しないため、相互に排他的ではなく、同時に実行されます。 |
フォローアップ2:Javaで同期キーワードを使用することの隠れた危険性は何ですか?
- 1)ロックタイムアウト時間を設定できません。
- 2)コードでロックを解除することはできません。
- 3)デッドロックが発生しやすい。
フォローアップ3:同期とロックの違い(* 3)
ロックタイプ | 同期 | ロック |
---|---|---|
パフォーマンス | リソースの競合が激しくない場合は、同期のパフォーマンスが向上します。 | リソースの競争が激しい場合、ロックのパフォーマンスは向上します |
ロック機構 | JVMレベルで実装され、システムはロックが解放されているかどうかを監視します | JDKコードの実装ですか?手動でリソースを解放する必要があります |
プログラミング | 同期はより簡潔で、メソッド/コードブロックで使用できます | Lockには多くの機能があり、柔軟性があります。欠点は、コードでしか記述できず、直接変更できないことです。 |
延伸:synchronize会根据锁竞争情况,从偏向锁-->轻量级锁-->重量级锁升级,lock可以采用非阻塞的方式获取锁。
4. ReentrantLockの基本的な実装原則(* 2)
ReentrantLockは、ロック取得とロック解除の2つの方法を書き換えることにより、フェアロックとアンフェアロックを実装します。
まず、ReentrantLockは親クラスLockを継承し、次に3つの内部クラスがあります。そのうちのSync内部クラスはAQSを継承し、他の2つの内部クラスはSyncを継承します。これら2つのクラスは、フェアロックとアンフェアロックに使用されます。
Syncによって書き換えられたメソッドtryAcquireおよびtryReleaseを通じて、ReentrantLockがAQSの排他モード、つまりペシミスティックロックである排他ロックを実装していることがわかります。
..。
5. Javaの読み取り/書き込みロック、
従来のロックとは異なり、読み取り/書き込みロックのルールでは、読み取りは共有できますが、書き込みできるのは1つだけです。要約すると、読み取りと読み取りは相互に排他的ではなく、読み取りと書き込みは相互に排他的であり、書き込みと書き込みは相互に排他的です。一般的な排他ロックは次のとおりです。読み取り読み取りは相互に排他的、読み取りと書き込みは相互に排他的、書き込みは相互に排他的です。シーンでは、読み取りは書き込みよりもはるかに大きいことがよくあります。読み取り/書き込みロックは、この最適化のために作成されたメカニズムです。 。読み取りは書き込みよりもはるかに大きいことに注意してください。一般に、排他ロックの効率が低いのは、同時実行性が高いクリティカルセクションをめぐる激しい競争が原因であり、スレッドコンテキストの切り替えにつながります。したがって、同時実行性がそれほど高くない場合、読み取りロックの状態がさらに維持されるため、読み取り/書き込みロックは排他ロックほど効率的ではない可能性があります。したがって、実際の状況に応じて選択する必要があります。
フォローアップ1:同時読み取りがロックされているのはなぜですか?
読み取りロックは、読み取りと書き込みを防止する中間値です。
6.揮発性は背景と機能を生み出す(* 2)
背景:プロセッサとメモリ間のマルチレベルキャッシュは、プロセッサの実行速度を向上させますが、キャッシュデータの一貫性が失われるという問題も引き起こします。ただし、複数のスレッドが同じ変数にアクセスし、1つのスレッドが変数値を変更するため、他のスレッドによる読み取りに一貫性がなくなる可能性があります。
機能:Volatileは変数修飾子であり、変数の変更にのみ使用でき、メソッドとコードブロックを変更することはできません。
使用法:単純です。volatileを使用して、複数のスレッドが同時にアクセスする可能性のある変数を変更します。
补充:
1、缓存一致性背景:多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议
2、缓存一致性协议:每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。
フォローアップ1:Volatileはどのように可視性を保証しますか?
可視性:複数のスレッドが同じ変数にアクセスすると、1つのスレッドが変数値を変更し、他のスレッドは変更された値をすぐに確認できます。
Volatileは、変更された変数を変更後すぐにメインメモリに同期でき、変数は使用するたびにメインメモリから更新されます。したがって、マルチスレッド操作中の変数の可視性を保証できます。
変数がvolatileによって変更された場合、その値は、データが変更されるたびにメインメモリに強制的にフラッシュされます。他のプロセッサのキャッシュも、キャッシュコヒーレンシプロトコルに準拠しているため、この変数の値をメインメモリから独自のキャッシュにロードします。
フォローアップ2:Volatileはどのようにして秩序を確保しますか?
Volatileは命令の再配置を禁止し、コードが厳密な順序で実行されるようにします。これにより、秩序が確保されます。
原子性:一个或一组操作要么都做,要么都不做。volatile不能保证原子性。
フォローアップ3:アプリケーションシナリオ?変数は1つずつ増え続けますが、同時に追加できますか?
アプリケーションシナリオ:変数の値は、更新時の現在の値に依存せず、変数は他の変数と不変の条件を形成しません。
例如:
1、可用volatile
1-1)只有一个线程执行写操作,其它线程都是读操作;
1-2)只有简单读写操作,如set i=2, get i。
2、不能用volatile
i++就不行,它有一次读一次写
フォローアップ4:最下層を実現する方法は?
メモリバリア...
7.揮発性と同期の違い
キーワード | 揮発性 | 同期 |
---|---|---|
使用レベル | 変数のみを変更できます | 変更可能な変数、メソッド、およびクラス |
エレメント保証 | 可視性と順序のみを保証する | 可視性、順序、および原子性を確保します |
ブロック | スレッドブロッキングを引き起こしません | 多分 |
コンパイラの最適化 | タグ変数は最適化されません | タグ変数を最適化できます |
- 本質的なコントラスト
- volatileの本質は、レジスタ(作業メモリー)内の現在の変数の値が不確実であり、メインメモリーから読み取る必要があることをJVMに通知することです。
- 同期とは、現在の変数をロックすることです。現在のスレッドのみが変数にアクセスでき、他のスレッドはブロックされます。
4、参照
1.睡眠()と待ち時間の差は()
でのJava 2のJavaマルチスレッドでの睡眠と待ち時間の差は非常によくまとめられています。
3.睡眠、歩留まり、待機との間に差が参加(アリ)
4.違い通知してnotifyAll(生産者、消費者の場合)
5.違い通知してnotifyAll
6 Javaで通知してnotifyAllの違いは何ですか?
7. JavaのnotifyとnotifyAllの違いは何ですか?
8.再入の深い理解
9.同期同期の静的メソッドの概要および非静的メソッド
10同期とReentrantLockの差の話
11 ReentrantLockのリエントラントロックの概要(同期との差)
12のJavaの2つの同期方法SynchronizedとReentrantLockの違い
13、Java同期マルチスレッド同期問題の詳細な説明
14、インタビュアー:マルチスレッド同時実行問題について話す
15、同期原理の詳細な分析(Aliインタビューの質問)
16同期とロックの間の差
17のIn実現原理の深い理解
のReentrantLockの18 ReentrantLockの実現原理
19.読み書きロックのJavaを実現原理
20読み取りロックを使用することは何?なぜ読書がロックされているのですか?
21、Java並行プログラミングの原則と実際の戦闘18:読み取り/書き込みロック
22、Java
23のvolatileキーワードの詳細な理解、30分間のインタビュアーとのvolatile
24、volatileと同期の違い