ロックを達成するためのJava

AQSは、javaロックの達成の中心であるが、まだだけちょうどそれがこのクラスのいくつかの主要な方法を書き換えることができます継承実現しています。

1.まず、同期クラスの定義、継承AQS。

//ここでロックを実装同期内部クラスが存在しなければならないAQS継承する必要が
AbstractQueuedSynchronizer {拡張MySyncプライベート静的クラスを
/ **
*利用CAS現在のスレッドの状態が1に設定されているCASの使用のロックをつかむ、同期ステータスを変更しようとするが、現在の所有者を設定しますスレッドの
ロックの状態を設定する引数*の@paramに設定する必要があり1
* @return
* /
@Overrideは
tryAcquire(int型のArg){にブールを保護
{IF(アルギニン= 1!)
スローのRuntimeException新新( "引数が1ではありません");
}
/ / CASは、同期ステータスを変更しようとするために使用される
IF(compareAndSetState(0,1)){
setExclusiveOwnerThread(にThread.currentThread());
trueに戻る;
}
falseに復帰;
}

/ **
*ロック解除操作がCASを必要としない
* @param argを
@return *
* /
@Overrideは
ブールtryRelease(INTのArg){保護
IF(getStateを()== 0){
スロー新しい新しいは、IllegalMonitorStateExceptionを();
}
//ロックは、任意のスレッドによって保持されていない設定
setExclusiveOwnerThread(NULL);
SETSTATE(0 );
trueに戻る;
}

@Overrideは
ブールisHeldExclusively(保護){
== getstate()をを返す1;
}
}
2.ロックを達成するために、自分自身のロックを定義する自然、次のように
/ ** 
*手動ロック機構は、javaの実現である
いくつかの方法を実装するには、ここ*主:のtryLock、ロック、UNLO​​CK
* /
publicクラスをMyLock実装ロック{
  
  //のここだけのAQS参照サブクラス
=新しいMySyncプライベートMySync mySync() ;

@Override
公共ボイドロック(){
mySync.acquire(1);
}

@Override
パブリックブールのtryLock(){
mySync.tryAcquireを返す(1);
}

@Override
パブリックブールのtryLock(長時間、TimeUnitで単位)InterruptedExceptionある{スロー
リターンmySync.tryAcquireNanos(1時間);
}

@Override
公共ボイドUNLOCK(){
mySync.release(1);
}

@Override
パブリック条件newCondition(){
戻りヌル。
}
@Override
公共ボイドlockInterruptibly()は、InterruptedExceptionある{スロー

}
}
まあ、唯一の2つのクラスが取得します。次のテストの下Haoshiかどうか。スレッドを定義するには、使用したロックは、独自の実現します
MyThreadクラスを実装Runnableを{公共

MyLock myLock新しい新MyLock =();
@Override
公共ボイドRUN(){
試み{
myLock.lock();
TimeUnit.SECONDS.sleep(3);
System.out.printlnは(にThread.currentThread() .getName()+ "\ tは" + " が実行される..." + DateUtil.now());
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
最後に{
myLock.unlock();
}

}
}

最後に、以下のテストクラスは、我々は小規模10個のスレッドをオンにし、
/ ** 
*测试类
* /
パブリッククラスTest {
パブリック静的無効メイン(文字列[] args){
MyThread myThread =新しいMyThread()。

{(私は++; iが10 <I = 0 INT)のために
。( " -スレッド" myThread、I +))(開始新しいスレッド。
}
}
}
次のように出力ショットは以下のとおりです。

二列のロックをオフに書き込み、

 

効果は明ら​​かです


おすすめ

転載: www.cnblogs.com/hd-zg/p/11202203.html