2つのカテゴリに分類するJavaロック:2キーロック修飾同期1は、ReentrantLockのJUC容器(再入)の同期は、キーロックを改変しました
ReentrantLockのと同期の違い:
1、リエントラント、両方のカウンタが0である場合、カウンタは1だけインクリメントされるロックにスレッドがある場合、同じである、ロックが解除されます
図2は、ロックを達成するために、ロックが達成同期JVMに基づいており、JDKはReentrantLockの達成に基づいています
単純に実装するため、3、パフォーマンスの違いは、同期パフォーマンスの最適化の後、両者の差が非常に小さく、同期を使用することをお勧めします
4、差関数:複数使用すると便利で便利な同期は、JVMによってロック実装され、ReentrantLockのコードを介してロック機構を実装する必要があり、きめの細かいと柔軟性のロックがReentrantLockのの同期によるものです
ReentrantLockのユニークな機能:
1、ReentrantLockのが唯一の非公正ロックを同期、公正または不当なロックロックするかどうかを指定することができ、いわゆるフェアロックはロックを取得するためのスレッドを待つことです
2、スレッドを達成することができウェイクアップウェイクアップする必要性をグループ化し、条件クラスを提供します
3、lock.lockinterruptibly、ロックを待っているスレッドを中断できる仕組みを提供
ReentrantLockのコード例:
パッケージMyStudyTest.LOck; 輸入com.mmall.concurrency.annoations.ThreadSafe。 輸入ロンボク。extern .slf4j.Slf4j; 輸入java.util.concurrent.CountDownLatch。 輸入java.util.concurrent.ExecutorService。 輸入java.util.concurrent.Executors。 輸入java.util.concurrent.Semaphore。 輸入java.util.concurrent.locks.Lock。 輸入java.util.concurrent.locks.ReentrantLock。 @ SLF4J @ThreadSafe パブリック クラスLockExample1 { // 总请求数 プライベート 静的 int型 clientTotal = 5000 ; // 总的并发请求数 プライベート 静的 int型 threadTotal = 200 ; プライベート 静的な int型のカウント= 0 ; 民間最終静的ロックロック = 新しいReentrantLockの(); パブリック 静的 ボイドメイン(文字列[]引数)が例外:InterruptedExceptionをスロー{ // 创建一个动态可变长线程池 ExecutorServiceのExecutorServiceの= Executors.newCachedThreadPool()。 たCountDownLatchたCountDownLatch = 新たCountDownLatch(clientTotal)。 セマフォSEMA = 新しいセマフォ(threadTotal)。 ために(int型 I = 0 ; iが<clientTotalを、私は++ ){ executorService.execute(() - > { 試みる{ sema.acquire(); 追加(); sema.release(); } キャッチ(InterruptedExceptionあるE){ e.printStackTraceを(); } 最後に{ countDownLatch.countDown(); } })。 } たCountDownLatch。待ちます(); executorService.shutdown(); log.info("カウント:} { " ;)、カウント } プライベート 静的 ボイド{add()を ロック。ロックを(); してみてください{ カウント ++ ; } 最後に{ ロック;)(.unlock } } }
いくつかのメソッドを使用してReentrantLockのについて:(多くの機能のスレッド操作を提供します)
1、のtryLock() - :ときのみスレッドコールロックを取得するためにそれを呼び出す別のスレッドによってロックされずに
lockinteruptibly 2:現在のスレッドが中断されていない場合にのみスレッドが中断された場合、唯一の例外をスロー、ロックを取得します
ReenTrantReadWriteLock:なし読み書きロックが存在しない場合には、彼らがロックを取得する前に