下面是自己实现的独占锁
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(); } }