自定義同步組件(鎖)

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

/**
 * 
 * 作爲鎖(自定義同步組件)的使用者,在使用鎖時並不會和內部的同步器打交道,通常是調用鎖提供的方法。
 * @author gaoyi
 * @date 2017-06-20
 *
 */
public class Mutex implements Lock{

	//自定義同步器
	private static class Sync extends AbstractQueuedSynchronizer {
		
		protected boolean isHeldExclusively() {
			return getState() == 1;
		}
		
		public boolean tryAcquire(int acquires) {
			if(compareAndSetState(0, 1)) {
				setExclusiveOwnerThread(Thread.currentThread());
				return true;
			}
			return false;
		}
		
		protected boolean tryRelease(int releases) {
			if(getState() == 0)
				throw new IllegalMonitorStateException();
			setExclusiveOwnerThread(null);
			setState(0);
			return true;
		}
		
		Condition getCondition() {
			return new ConditionObject();
		}
	}
	
	private final Sync sync = new Sync();

	@Override
	public void lock() {
		sync.acquire(1);
	}

	@Override
	public void lockInterruptibly() throws InterruptedException {
		sync.acquireInterruptibly(1);
	}

	@Override
	public boolean tryLock() {
		return sync.tryAcquire(1);
	}

	@Override
	public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
		return sync.tryAcquire(1);
	}

	@Override
	public void unlock() {
		sync.release(1);
	}

	@Override
	public Condition newCondition() {
		return sync.getCondition();
	}
}


說明:隊列同步器,是用來構建鎖或者其他同步組件的基礎框架,是實現大部分同步需求的基礎。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章