ロックインタフェース
Java1.5後、及び同期キーワード同様の機能との同期を提供するロック機能を達成するために収縮ロックインターフェース(および関連する実装クラス)を、添加し、必須での使用に明示的に取得してロックを解除します。それはロックの解除(synchronizedブロックまたはメソッドを介して提供される)便宜上、それは同期ロック取得の多様を有し、キー操作性を解放し、割り込みロック取得タイムアウト取得ロックを取得暗黙を欠いているもののワード同期特性を持っていません。
使用することは非常に簡単でロックします。次のとおりです。
Lock lock = new ReentrantLock();
lock.lock();
try{
}finally{
lock.unlock();
}
オブジェクトはロックが取得されていることを確認することです後に最後のブロックのロックが解除され、それが最終的に解放することができます。
買収は異常、例外が同時に投げられるロック(カスタム実装)の時に発生したかのように、tryブロックの作成プロセスでロックされてはいけない、理由もなくロックの解除につながることができます!
synchronizedキーワードロック・インターフェースの主な特徴は以下が含まれて:
プロパティ | 説明 |
---|---|
ロックを取得するためにノンブロッキングの試み | 現在のスレッドは、時間が他のスレッドに取得されていない場合は、ロックを取得して正常取得し、ホールドロックしようとします |
ロックへのアクセスを中断することができます | そして、同期異なるスレッドは、取得したロックのスレッドが中断されたときにロックが解除されている間、割り込み例外がスローされますが、割り込みに対応するためにロックを獲得することができます |
タイムアウト獲得ロック | 締め切りはまだロックを取得できない場合に、指定された期限前にロックを取得し、返します |
ロックAPIインタフェース:
方法 | 説明 |
---|---|
空ロック() | ロックを取得するために、方法は、ロック獲得は、メソッドから返されたときに、現在のスレッドがロックを取得すると呼ばれています |
空lockInterruptibly()例外:InterruptedExceptionがスローされます | それはロック、ロック方法と、現在のスレッドを中断することができ、割り込みに対応できる方法は、ロックを取得していることを取得中断と異なる場合があり |
ブールのtryLock() | それ以外の場合はロックを取得しようとすると、メソッドが呼び出された後、我々はリターンが真得ることができる場合、すぐに戻り、偽ノンブロッキング |
ブールのtryLock(長い時間、TimeUnit unit)指定例外:InterruptedExceptionをスロー | ロックタイムアウトを取得し、現在のスレッドは、次の3つの条件に戻ります: 1.現在のスレッドをタイムアウト時間内にロックを取得するために 、現在のスレッドがタイムアウト期間内に中断された2 端3.タイムアウトを、falseを返します |
空ロック解除() | ロックを解除 |
条件新しい条件() | バインディングをロック通知コンポーネントと現在のスレッドを待って取得し、現在のスレッドが唯一のコンポーネントの待ち時間()メソッドを呼び出す前に、ロックを取得し、現在のスレッドのリリースにロックを呼び出します |
グラブ票への単純なケースをシミュレート
package pers.zhang.juc.part1;
import sun.security.krb5.internal.Ticket;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author zhang
* @date 2020/1/17 - 19:54
*/
public class TestLock {
public static void main(String[] args) {
TrainTicket ticket = new TrainTicket();
new Thread(ticket, "1号窗口").start();
new Thread(ticket, "2号窗口").start();
new Thread(ticket, "3号窗口").start();
}
}
class TrainTicket implements Runnable{
private int tick = 100;
private Lock lock = new ReentrantLock();//Lock的实现类
@Override
public void run() {
while(true){
lock.lock(); //上锁
try{
if(tick > 0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick);
}
}finally{
lock.unlock(); //释放锁
}
}
}
}