I.はじめ
ReentrantLockのは、多くの場合、同期分析とは対照的に、我々は少し分析によって少し後、第一項とを比較します。
(1)同期が排他的ロック、ロックと、自動操作しやすく、あまり柔軟アンロックプロセスです。ReentrantLockのも排他的ロックは、ロックおよびロック解除プロセスは、手動操作しやすい、非常に柔軟です。
(2)同期リエントラント、ロックおよび自動ロック解除、ロックの最終リリースかどうかを気にせずため、またReentrantLockのリエントラントが、手動ロック・アンロック、及びロックを取得できない同じ、又は他のスレッドをする番号を必要とします。
(3)は、割り込み応答を同期、ロックを取得できないスレッドが待っている。ReentrantLockの割り込み対応することができます。
ReentrantLockのは、はるかに良いsynchronizedキーワードよりも思えなかった、我々は、最も重要なのは、ReentrantLockのは、公平性のロック機構を実現することが可能である、同期されていないことで見ることができます。フェアロックは、それは何ですか?それは、ロックを使用する権利を取得する最長のを待機しているスレッドがロックされています。誰がロックを取得するために、最長待ち行列を実行する必要があり、誰の人気の理解です。
2:同期に比べてReentrantLockの追加機能
ロックが利用可能であることをフェアロック手段は、ロックを使用する権利を取得する最長のを待っているスレッドロック。むしろランダムにこの権利を使用するために割り当てられた公正ロックより。そして公正良くロックに比べ、不公平なパフォーマンスをロックするよう、公正なロックを達成し、デフォルト以外のReentrantLockのように同期させています。もちろん、フェアロックは飢餓を防ぐために、いくつかのケースでも有用です。入ってくる伝送パラメータは、非資本の創出をロックする偽であるかどうか、真のロック公正引数にパスを通してReentrantLockの作成時に作成しました
静的ロックロック= 新しい ReentrantLockの(真の);
コードは次の通り:
パブリック クラスReentrantLockTest {
静的ロックロック= 新しい ReentrantLockの(真の);
パブリック 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionあるが{
ため(INT iは= 0; I <5; I ++ ){
新しいスレッド(新しいThreadDemo(I))(開始します)。
}
}
静的 クラス ThreadDemo 実装Runnableを{
整数ID。
公共ThreadDemo(整数ID){
この .ID = ID。
}
@Override
公共 ボイドラン(){
試み{
TimeUnit.MILLISECONDS.sleep( 10 )。
} キャッチ(InterruptedExceptionある電子){
e.printStackTrace();
}
ため(INT I 0 =; I <2; I ++ ){
lock.lock()。
System.out.println( "获得锁的线程:" + ID)。
施錠開錠();
}
}
}
}
実行結果は以下のとおりです。
获得锁的线程:4
获得锁的线程:1
获得锁的线程:2
获得锁的线程:0
获得锁的线程:3
获得锁的线程:4
获得锁的线程:1
获得锁的线程:2
获得锁的线程:0
获得锁的线程:3
非公平锁运行结果如下所示:
获得锁的线程:1
获得锁的线程:1
获得锁的线程:2
获得锁的线程:2
获得锁的线程:3
获得锁的线程:3
获得锁的线程:4
获得锁的线程:0
获得锁的线程:0
获得锁的线程:4
线程会重复获取锁。如果申请获取锁的线程足够多,那么可能会造成某些线程长时间得不到锁。这就是非公平锁的“饥饿”问题。
公平锁和非公平锁该如何选择:
大部分情况下我们使用非公平锁,因为其性能比公平锁好很多。但是公平锁能够避免线程饥饿,某些情况下也很有用。