下面是自己实现的独占锁
package ch4.aqs;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class SelfLock implements Lock {
private static class Sync extends AbstractQueuedSynchronizer {
// 表示获取到锁 state= 1 获取到锁,state=0 ,表示这个当前没有线程拿到
@Override
protected boolean isHeldExclusively() {
return getState() == 1;
}
@Override
protected boolean tryAcquire(int arg) {
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());// 表示当前线程拿到了这个锁
return true;
}
return false;
}
@Override
protected boolean tryRelease(int arg) {
if (getState()==0) {
throw new UnsupportedOperationException();
}
setExclusiveOwnerThread(null);// 当前没有线程独占
setState(0);// 只有拿到锁的线程才会释放锁,所以没有多个线程同时去释放的
return true;
}
Condition newCondition(){
return new ConditionObject();
}
}
private final Sync sync= new Sync();
@Override
public void lock() {
// 获取锁
sync.acquire(1);// 因为是个独占锁所以是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.tryAcquireNanos(1,unit.tonanos(time));
}
@Override
public void unlock() {
sync.release(1);
}
@Override
public Condition newCondition() {
return sync.newCondition();
}
}
下面进行测试
package ch4.aqs;
import tools.SleepTools;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestMyLock {
public void test(){
final Lock lock= new SelfLock();
class Worker extends Thread{
@Override
public void run() {
while (true){
lock.lock();
try {
SleepTools.second(1);
System.out.println(Thread.currentThread().getName());
SleepTools.second(1);
} finally {
lock.unlock();
}
SleepTools.second(2);
}
}
}
// 启动10个线程
for (int i = 0; i < 10; i++) {
Worker w = new Worker();
w.setDaemon(true);
w.start();
}
for (int i = 0; i < 10; i++) {
SleepTools.second(1);
System.out.println();
}
}
public static void main(String[] args) {
TestMyLock testMyLock = new TestMyLock();
testMyLock.test();
}
}



