ダグ・リーのスレッドプール
- 一般的なスレッドプール
- タイミングスレッドプール
ThreadPoolExecutor
コンストラクタのパラメータ:
corePoolSize:アイドル状態のスレッドを含めて、プールに保持するスレッド数
•maximumPoolSize:プールで許可されるスレッドの最大数
スレッド数がコアよりも大きい場合には、新たな超過したアイドル状態のスレッドが最大時間前に終了するため、この作業が待っています:•keepAliveTimeが
•ユニット:時間単位keepAliveTimeがパラメータ
•ワークキュー:キューを保持するためのタスクを実行する前に。このキューは、executeメソッドにより提出されたRunnableタスクを保持している
実行手順の新しいスレッド作成時に使用する工場は:•threadFactory
•ハンドラ:スレッドの境界およびキューの容量としてを実行するため
の方法を提出します:
- コア未満
addWork - コアよりも大きいです
- 直接の任務を高めます
- 3増加は拒否に失敗した場合は
拒否方針を
-
スレッドプールは、4つの方針を否定あり:
AbortPolicy:、デフォルトの例外をスロー
CallerRunsPolicyを:実行するスレッドプールを使用しない
DiscardPolicyを:破棄タスク
DiscardOldestPolicy:選択したスレッドプールのキューに最も古いタスクを破棄しハンドラ=新しい新しいのRejectedExecutionHandlerによって拒否ポリシー
ThreadPoolExecutor.CallerRunsPolicy();設定。
JPS> jstack
jstack ISのトラブルシューティングスレッドのデッドロック
差分法を提出&futuretask
- 戻り値かどうか
- タスクは、それ自体が同じfuturetask作業ではありません
CASは、ロックと楽観的な考えを達成しています
3つのキーワードでのマルチスレッド
- 不可分性
- 可視
- 注文
これらの3つの問題に対処するためにJavaキーワードレベル:
- - 揮発性:秩序、視認性を確保するために
可変のスレッド修正値であり、この変数操作、異なるスレッドが、他のスレッドにこの新しい値が直ちに表示されているときの視認性を確保⚫。
⚫禁止命令の並べ替え。 - 同期:ヘビーロック、重量ロックに(チョン)
⚫通常の同期方法は、ロックオブジェクトの現在のインスタンスです。
⚫静的な同期メソッドの場合、ロックは現在のクラスのClassオブジェクトです。
ブロックの⚫同期方法は、オブジェクトのロックがSynchonizedブラケットに構成されています。
方法:ACC_SYNCHRONIZED、コードブロック:monitorenter monitorexit
ロックロック: - ReentrantLockのリエントラントロック:手動、ロック命令、synchornizedよりも柔軟な
生産者-消費者モデルへの適用条件コンディションのために - ReentrantReadWriteLockの書き込みロック
スタンプロックjdk1.8後
try{
//上锁
lock.lock();
...
}finally{
//解锁
lock.unlock();
}
方法
• void lock() 获取锁,调用该方法当前线程将会获取锁,当锁获取后,该方法将返回。
• void lockInterruptibly() throws InterruptedException 可中断获取锁,与 lock()方法不同之处在于该方
法会响应中断,即在锁的获取过程中可以中断当前线程
• boolean tryLock() 尝试非阻塞的获取锁,调用该方法立即返回,true 表示获取到锁
• boolean tryLock(long time,TimeUnit unit) throws InterruptedException 超时获取锁,以下情况会返回:
时间内获取到了锁,时间内被中断,时间到了没有获取到锁。
• void unlock() 释放锁
统计:
java.util.concurrent.locks.ReentrantLock#getHoldCount
java.util.concurrent.locks.ReentrantLock#getQueuedThreads
- ReentrantReadWriteLock読み書きロックの
排他的できめ細かな問題は、読み取りと書き込みを共有している
java8が読み書きロックの最適化を増加:StampedLock - AbstractQueuedSynchronizerキューシンクロナイザ
java.util.concurrent.locks.AbstractQueuedSynchronizer#acquire 独占式获取同步状态
java.util.concurrent.locks.AbstractQueuedSynchronizer#acquireInterruptibly 独占式获取同步状态,未获取可以
中断
java.util.concurrent.locks.AbstractQueuedSynchronizer#acquireShared 共享式获取同步状态
java.util.concurrent.locks.AbstractQueuedSynchronizer#acquireSharedInterruptibly 共享式获取同步状态,未获
取可以中断
java.util.concurrent.locks.AbstractQueuedSynchronizer#release 独占释放锁
java.util.concurrent.locks.AbstractQueuedSynchronizer#releaseShared 共享式释放锁
- AたCountDownLatch(同期ツール)
たCountDownLatch、整数値を指定し、この値は、スレッドの数が操作を待機するあります。順にスレッドが待っている間にこれらの操作を実行する場合は、のawaitメソッドを呼び出します。完了するために、すべての保留中の操作まで、スリープ状態にスレッドを取得するためのawaitの方法。待っている間
、操作の実行完了、それは内部カウンタカウントダウンたCountDownLatchクラスを減らすための方法を使用しています。内部カウンタのデクリメントが0の場合、たCountDownLatchは、すべてのコールがメソッドが休止スレッドです待って目覚めます。
⚫ java.util.concurrent.CountDownLatch#await()
⚫ java.util.concurrent.CountDownLatch#countDown()
⚫ java.util.concurrent.CountDownLatch#getCount()
原則
たCountDownLatchのコンストラクタは、カウンタとしてint型のパラメータを受け入れ、あなたはNポイントの完了を待つしたい場合は、あなたがここにNを渡します
私たちはたCountDownLatchのカウントダウンメソッドを呼び出すとNがゼロになるまで、Nはなりマイナス1、たCountDownLatchのawaitメソッドブロック、現在のスレッドになります。カウントダウン方法はNポイントを言うためにので、ここで、どこでも使用することができますので、N個のスレッドは、それがNの実行ステップのスレッドすることができ、することができます。複数のスレッドを使用する場合は、ちょうどこのたCountDownLatchスレッドへの参照をすることができ渡す必要があります。たCountDownLatchは、コンストラクタによる初期カウント数と、使い捨てで、カウントアップをリセットすることはできません、多重化を達成することはできません。
- セマフォ(セマフォ)を同時に公共資源の合理的な利用を確保するために、さまざまなスレッドの調整を介しており、特定のリソースにアクセスするスレッドの数を制御するために使用されます。
java.util.concurrent.Semaphore#acquire() 获取许可
java.util.concurrent.Semaphore#release() 释放许可
java.util.concurrent.Semaphore#tryAcquire() 尝试获取许可
雪のアルゴリズム
HashMapの
展開を最適化するには?
サイズ、初期設定を推定
ReentrantLockの