[Java同時プログラミング実戦]14章カスタム同期ツールの構築
21267 ワード
ステータス依存性の管理
じょうけんキュー
public synchronized void put(V v) throws InterruptedException{
while(isFull()){
System.out.println(new Date()+" buffer , thread wait:"+Thread.currentThread().getName());
wait();
}
doPut(v);
System.out.println(new Date()+" "+Thread.currentThread().getName()+" :"+v+" ");
notifyAll();
}
public synchronized V take() throws InterruptedException {
while(isEmpty()){
System.out.println(new Date()+" buffer , thread wait:"+Thread.currentThread().getName());
wait();
}
notifyAll();
// , ,
V v = doTake();
System.out.println(new Date()+" "+Thread.currentThread().getName()+" :"+v);
return v;
}
void stateDependentMethod() throws InterruptedException{
synchronized(lock){
while(!conditionPredicate())
lock.wait();
//
}
}
明示的なConditionオブジェクト
/**
*
*/
public class ConditionBoundedBuffer<T> {
protected final Lock lock = new ReentrantLock();
// :notFull (count < items.length)
private final Condition notFull = lock.newCondition();
// :notEmpty (count > 0)
private final Condition notEmpty = lock.newCondition();
private static final int BUFFER_SIZE = 100;
@GuardedBy("lock")
private final T[] items = (T[]) new Object[BUFFER_SIZE];
@GuardedBy("lock")
private int tail,head,count;
// :notFull
public void put(T x) throws InterruptedException {
lock.lock();
try{
while(count == items.length)
notFull.await();
items[tail] = x;
if(++tail == items.length)
tail = 0;
++count;
notEmpty.signal();
}finally{
lock.unlock();
}
}
// :notEmpty
public T take() throws InterruptedException{
lock.lock();
try{
while(count==0)
notEmpty.await();
T x = items[head];
items[head] = null;
if(++head == items.length)
head = 0;
--count;
notEmpty.signal();
return x;
}finally{
lock.unlock();
}
}
}
AbstractQueuedSynchronizer
/**
*
*/
private volatile int state;
/**
*cas
*/
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
同期器はロックを実現する鍵であり、同期器を利用してロックの意味を実現し、ロックの実現で同期器を集約する.ロックのAPIは使用者向けであり、ロックと相互作用する共通の動作を定義しているが、各ロックが特定の動作を完了する必要があるのもこれらの動作を通じて行われる(例えば、2つのスレッドをロックし、2つ以上のスレッドを排除することができる)が、実装は同期器に依存して行われる.同期器はスレッドアクセスとリソース制御に向いており、スレッドがリソースを取得できるかどうかやスレッドのキューなどの操作を定義しています.ロックと同期器は両者が注目すべき分野をよく隔離しており、厳密には、同期器はロック以外の同期施設(括弧ロック)に適用できる.
java.util.concurrentシンクロナイザクラスのAQS
java.util.concurrentの多くのブロッキング可能クラスはAQSに基づいて構築されています